一、HTTP协议的概念
💌💌💌HTTP协议即超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议 . 所有的WWW文件都必须遵守这个标准.它是一种使用非常广泛的 应用层协议💕💕💕, 往往是基于传输层的😸😸 TCP 协议来实现的.
二、HTTP 协议格式
💡想要获取HTTP协议的请求和响应,可以通过 Chrome 开发者工具(F12)或者 Fiddler 工具进行抓包,注意,要想通过 Fidder 抓取 HTTPS 的包,就要信任它的证书.
💯方法:进入Fiddler 工具后,点击 TOOls——>Options——>HTTPS,全部勾选.
1.请求
🌐首行: 方法名+URL+版本号。
🌐Header部分: 表示请求的属性, 遇到空行则结束, 每组属性之间使用换行分隔,键和值之间用 “:+空格” 进行分隔.
🌐Body部分: Header后面的内容就是Body. 如果Body存在, Header里会有一个Content-Length属性来标识Body的长度;如果是一段html代码, 那么html页面内容就是在body中,当然Body部分也可以省略.
GET https://www.csdn.net/ HTTP/1.1
Host: www.csdn.net
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: “Google Chrome”;v=“107”, “Chromium”;v=“107”, “Not=A?Brand”;v=“24”
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525110_37481495260-1635435-799719!5744; dc_session_id=10_163906.280412; _ga=GA1.2.1574059973.164470; _ga_VHSCGE70LW=GS1.1.16444.3.1.1643.0;
此处的URL: https://www.csdn.net/
🐶https : 表示协议名. 常见的有 http 和 https, 还有一些其他的类型. (例如 java 访问 mysql数据库时用的
jdbc:mysql:// ).
🐶www.csdn.net : 表示服务器地址, 也可以用域名来表示.打开命令行窗口(cmd)
输入命令:ping www.csdn.net,就可以看到 CSDN 的真实 IP 地址为 60.205.172.2.
🐶端口号: 此处CSDN 的端口号被省略了, 浏览器则会自动根据协议类型使用某个端口. http 协议默认端口号为80; https 协议默认端口号为443.
再次点击一个文章进去,此时请求的URL端口号后面一般就是带层次文件路径.
spm=3001.5298: 表示查询字符串(query string), 键和值之间使用 = 分隔. 当有多个键值对的时候,使用 & 分隔.
🐻🐻🐻HTTP 协议中设置 “空行” 的原因:
因为我们并不知道 Header 部分的键值对有多少个. 空行就相当于是 “报头的结束标记”.
第二,HTTP 在传输层依赖 TCP 协议实现, TCP 是面向字节流的. 如果没有空行, 就会出现 “粘包问题”,分不清报文从哪里结束.
2.响应
🌐首行: 版本号+状态码+状态码描述.
🌐Header部分: 表示请求的属性, 遇到空行则结束, 每组属性之间使用换行分隔,键和值之间用:+空格进行分隔.
🌐Body部分: Header后面的内容就是Body内容. 如果Body存在, Header里会有一个Content-Length属性来标识Body的长度;如果是一段html代码, 那么html页面内容就是在body中,当然Body部分也可以省略.
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Server: openresty
Vary: Accept-Encoding
X-Response-Time: 358
x-content-type-options: nosniff
x-download-options: noopen
x-readtime: 358
Strict-Transport-Security: max-age=31536000
Content-Length: 671142
< content=“CSDN博客,CSDN学院,CSDN论坛,CSDN直播”> meta name=“description” content=“CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区.”>
三、常见的Header属性
👁️🗨️1.Host
Host: www.csdn.net
表示服务器主机的地址和端口. 此处CSDN 的端口号被省略了,浏览器则会自动根据协议类型使用某个端口. http 协议默认端口号为80; https 协议默认端口号为443.
👁️🗨️2.Content-Length
表示 body 中的数据长度.
👁️🗨️Content-Type
表示请求的 body 中的数据格式. 主要有 json 格式,form表单提交格式.
👁️🗨️User-Agent
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36
其中 Windows NT 10.0; Win64; x64 表示操作系统信息, Chrome/107.0.0.0 Safari/537.36 表示浏览器信息.
👁️🗨️Referer
表示这个页面是从哪个页面跳转过来的. Referer: https://www.csdn.net/
如果直接在浏览器中输入URL, 或者直接通过书签访问页面时是没有 Referer 的. 这个属性一般用来计算广告费,我们平时用的微信,短视频等软件,虽然用户没有交钱,但是只要从固定网站进去,此时广告商就得给此互联网公司付费,谁拥有更多的流量,广告商就喜欢投入到那里.
👁️🗨️Cookie
Cookie: LCLKINT=6092; SNUID=BBCAD9735653BDEA9BE7B2AF5775B2E1; ABTEST=5|1668340251|v17; SUID=CD9C8E241431A40A000000006370DA1B; browerV=3; osV=1
Cookie属性一般存储用户的“身份标识”,有些网站用户私密权限的内容其他用户是访问不了的.实际存储的是一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器. 不同的网站Cookie值都是不一样的, 这样是为了增加隔离性,保护系统的安全.
四、GET和POST方法
1.GET方法的特点
GET方法一般用于向服务器获取数据,例如图片,js文件的获取.
- 首行的第一部分为 GET .
- URL 的 query string 可以为空, 也可以不为空.
- header 部分有若干个键值对组成.
- body 部分为空.
2. POST方法的特点
POST方法一般用于向服务器提交数据. 例如登录页面,from表单的提交.
- 首行的第一部分为 POST .
- URL 的 query string 一般为空, 也可以不为空.
- header 部分有若干个键值对组成.
- body 部分一般不为空. body 内的数据格式通过 body 的长度由 header 中的 Content-Length 表示,数据格式由 header 中的 Content-Type 来表示.
3.GET和POST之间的区别
💡 本质没有区别的,但是程序员之间为了增强代码的可读性和可维护性,默认形成了一种行业习惯.
- GET一般从服务器获取数据.POST一般向服务器提交提交数据.
- GET主要通过query string 来传递数据, POST则是使用body传递数据.
- GET一般是实现成"幂等的",POST一般不实现成"幂等’. 幂等:用于表示任意多次请求执行的结果均与一次请求执行的结果相同,例如查询账户余额,要是一直变主人你的心里什么感觉.
- GET 可以被缓存, POST 不能被缓存.
注意:POST 比 GET 更安全,这种说法是错误的. 虽然 POST一般在 body 里面传输数据,但是安全性的话,如果进行中间人攻击还是可以拿到数据, 判断协议是否安全,要根据破解难度来判断.