HTTP协议报文格式=》抓包工具(fiddler)
请求:
GET https://www.fiddler2.com/UpdateCheck.aspx?isBeta=False HTTP/1.1 1.首行
User-Agent: Fiddler/5.0.20211.51073 (.NET 4.8; WinNT 10.0.22621.0; zh-CN; 8xAMD64; Auto Update; Full Instance; Extensions: APITesting, AutoSaveExt, EventLog, FiddlerOrchestraAddon, HostsFile, RulesTab2, SAZClipboardFactory, SimpleFilter, Timeline)
Pragma: no-cache
Host: www.fiddler2.com
Accept-Language: zh-CN
Referer: http://fiddler2.com/client/TELE/5.0.20211.51073
Accept-Encoding: gzip, deflate
Connection: close
2.这一大段是请求头
3.空格
4.正文(body)
一.首行
(方法) (URL) 版本号
GET https://www.fiddler2.com/UpdateCheck.aspx?isBeta=False HTTP/1.1
请求就是客户端给服务器的发起的一个数据,这里要明确输出要访问的服务器是啥,要访问的服务器资源是啥
URL,JDBC唯一的资源定位符,用来描述网络上的资源
服务器地址:可以是IP地址,也可以是域名
可以是外网IP(本身就是唯一的)
也可以是内网IP(访问局域网中的设备)
还可以是环回IP(访问自己)
服务器的端口号:端口号用来区分应用程序
带层次的文件路径:访问服务器上的资源
查询字符串(query string):访问资源的时候,带上资源的参数(补充说明)
他是键值对的格式,键值对之间用&来分隔,键和值之间用=来分隔,查询字符串以?开始
都是程序员自定义的
片段标识符:不太常见主要是文档类的网站中能够看到
比如:我去卖熏肉大饼 在学校二楼的18号窗口
http://学校二楼:18/猪肉的熏肉大饼?辣椒=少放&葱=不放(针对对象的补充说明)
实际上URL有些部分是可以省略的
IP地址/域名省略:相当于访问当前服务器的地址
比如:访问B站的主页,请求里面必须要有bilibili域名,响应就是bilibili主页的HTML,这里HTML又又会触发其他http的请求,这些后续触发的http协议可以省略IP,省略IP就相当于使用和之前一样的bilibili HTML一样的IP
端口号也可以省略(相当常见)省略时浏览器会自动加上端口号(这个端口号表示访问服务器目标的那个端口)
注意:http的端口号是80 https的端口号是443
带层次的路径也可以省略
比如:https://www.sougou.com/ 这里/表示带层次的路径,也就是根目录(目录结构,树形结构,根目录,就相当于树根一样)
服务器提供的资源也类似于目录结构一样,树根结构来组织
query string 中有一些特殊字符,这些字符,可能在URL中有一些特殊的含义,就会导致服务器解析失败,经过urlencode 就不会出现特殊字符含义的符号,这样浏览器才能正确识别
urlencodede 转换规则:把要转换的二进制的每个字节,都是用十六进制表示出来
方法:GET(获取资源)最常用的
POST(传输实体主体)其次
PUT(传输文件) HEAD(获取文件首部)DELETE(删除文件)OPTIONS(访问支持的方法)
TRACE(追踪路径)CONNECT(需求用隧道连接代理协议)LINK(建立和资源之间的联系)
UNLINE(断开连接关系)
GET:从服务器中获取一样东西
POST:向服务器传输一样东西
虽然设计之初是这样想的,但是事于愿伪,事实上GET和POST不一定遵守这样的规定
GET https://www.sougou.com/HTTP/1.1 GET请求一般没有body
POST请求一般常见的场景:
1.登录
POST https://appstore.browser.qq.com/getMiniBrowserUpdateConfig HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0) QQBrowser/9.0
Host: appstore.browser.qq.com
Content-Length: 169
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: uin_cookie=3465932224; euin_cookie=B53474F3F470D8BD0C2D93F658A0B0FB7A377112FD377041; euin_cookie=B53474F3F470D8BD0C2D93F658A0B0FB7A377112FD377041; uin_cookie=3465932224
{
"COS": "10.0.22621",
"CVer": "",
"ExeVer": "",
"GUID": "8d04eabef3a45c68e5b8af87722cb623",
"QID": 16785447,
"QQVer": "",
"osDigit": 64
}
post请求会带有body,body前面的空格相当于分隔符,分割了Header和body,描述了body是从哪里开始的,body的格式有很多种,上述就是JSON,在登陆中这里就包含了登录账号和密码,这里的密码是加密的,不是明文
2.上传
他的body就是把个图片都进行转码,转成字符串
POST和GET的主要区别
GET是把一些数据放到query string中,body为空
POST是吧一些数据放到body中,query string为空
注意:放在query string用户可以看到(浏览器收藏夹也能收藏)
放在body用户看不到(收藏夹不能收藏)
总的来说GET和POST 没有本质上的区别,从习惯上来看GET把数据放在query string中,POST把数据放到body中
二.请求头
Header的整体个是是键值对,每个键值对占一行,键和值之间用分号分隔
键值对主要是标准规定的
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0) QQBrowser/9.0
Host: appstore.browser.qq.com
Content-Length: 169
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: uin_cookie=3465932224; euin_cookie=B53474F3F470D8BD0C2D93F658A0B0FB7A377112FD377041; euin_cookie=B53474F3F470D8BD0C2D93F658A0B0FB7A377112FD377041; uin_cookie=3465932224
Host:表示服务器主机的地址和端口,通常情况下URL和Host里的内容是一样的
Content-Length(解决粘包问题):描述了body的长度,如果有body的话必须要有,Content-Length,否则就是非法访问,如果没有body的话,就可以没有Content-Length
Content-type:body的数据格式
请求中常见的取值:1)application/x-www-from-urlencode 2)multipart/from-data 3)application/json
响应中常见的取值:1)text/html 2)text/css 3)application/javascript 4)application/json 5)image/pang......
User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0) QQBrowser/9.0
Windows NT 10.0:操作系统的版本
这个属性主要是包含当前机器系统和应用程序的版本
作用:因为互联网的快速发展,所以会更新代换很多版本,为了使每个版本都能够使用,因此想了个办法,就是浏览器在发起http请求的时候,向服务器自报家门,告述服务器,我是使用哪个系统的,啥浏览器上的网,服务器就根据这个信息来分别对待(兼容)
UA现在主要来区分是PC端,还是移动端
Referer(明文传输) :描述了当前页面是从哪里来的
如果是通过浏览器地址来直接输入url/点击收藏夹 打开的网页,这个请求是不带referer
如果你是点击了某个网页的页面的内容产生了跳转,就是带referer
比如:搜狗平台上要放广告主的广告,有很多的广告主,这里用户会点击不同的广告,区分每个广告主的广告点击的次数就要用referer,又因为referer是明文传输,因此可能会有运营商来修改广告的次数,所以就需要用到后续的https来进行加密
Cookie:是浏览器本地存储数据的一种机制(主要的保存机制)
比如:再看视频的时候勾选关闭弹幕下次就不用再勾选关闭弹幕,这些临时数据就是保存在Cookie中,但是换个电脑之后这些数据会消失
在浏览器访问服务器的时候是对服务器一无所知的(你的浏览器是没有任何和服务器有关的内容),浏览器拿到这些数据(返回的很多数据 html,jsonmcss,js,图片)后就可以展示到页面上了与此同时,在用户拿着网页,在操作过程中,也会产生很多临时性的数据这些临时性的数据,有时候是被放到服务器这边储存(下次就可以直接获得了,换电脑了也有效),有的不太重要,就直接放到浏览器这边储存(下次访问的时候也可以直接获得,但是换电脑了就没了)
目的:浏览器要保存东西,直接写入一个文件放到硬盘中是不行的(因为让网页轻易的访问文件系统是非常危险的,为了保证安全,浏览器对页面的功能做出限制,其中一个就是禁止访问硬盘),所以为了保证安全同时又能存储数据,浏览器就提供了一个Cookie功能(就是键值对的方式存储的字符串,这些键值对往往是服务器返回来的,浏览器把这些键值对按照域名的维度来存储)
构造请求头:
1.用HTML中的form标签(表单)构造http请求
<body>
URL 方法
<form action="https://www.sougou.com" method="get">
<input type="text" name="aaa">
<input stype="submit" value="提交">
</form>
</body>
2.用ajax来构造http请求
Ajax是异步的(通过代码,发出http请求,请求发出去后,js代码就继续往下执行了,当服务器响应回来之后,就会自动的通知到我们的代码中 ,进一步就能处理响应了)
响应:
HTTP/1.1 200 1.首行
Date: Wed, 04 Oct 2023 02:29:28 GMT 2.响应头
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Request-ID: 835a48545a1e59eeb59dfa0df5142fc6
Server: api-gateway
Access-Control-Allow-Origin: *
3.空行
51
{"errorCode":"SVCSTG.ALS.200.200","errorMessage":"Report success.","result":null}
0
4.body
版本号 状态码 状态码的描述
HTTP/1.1 200
状态码:
200:成功
404(NOT FOUND):访问的资源不存在
403:访问的资源没有权限
502:服务器挂了
504:服务器超时了
302:重定向(服务器会跳转到其他的页面上)
HTTP的重定向:比如:使用浏览器访问一个www.aaa.com的url,此时请求发送给对应的服务器,结果服务器发给你一个302,同时告述你,你要去访问www.bbb.com这个网站,这是浏览器收到响应后就会跳转到www.bbb.com这个网站中