
目录
HTTP(全称为“超文本传输协议”)是一种应用很广泛的 应用层协议.
http往往是基于传输层的TCP协议实现的.
HTTP 是一个文本格式的协议. 学习HTTP协议,重点学习HTTP的报文格式,分为两部分看待,请求 和 响应. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节.

http使用场景:1.浏览器访问网站 2.手机App访问对应的服务器 (通过http协议传输数据)
当我们在Bing浏览器中输入一个 "搜狗网址", 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应.
.

事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程.
http协议,是一种“一问一答” 结构模型的协议。请求和响应的协议和格式。
一问一答:访问网站
多问多答:上传文件
一问多答:下载文件
多问多答:串流/ 远程桌面
Fidder官方下载地址:https://www.telerik.com/fiddler/
安装可以自定义路径一路next,就可以非常简答 !
新安装的fidder 还需要我们手动开启 HTTPS 功能,并且安装证书的. (否则只能抓htttp)
1.打开fidder, 找到Tools,点击Options.

2. 选HTTPS,把对号都选上,会弹出一个框,意思就是是否要安装证书,选Yes就完了.

上诉操作完成之后就可以使用了.
3.fidder打开之后,是一个左右结构的程序,左边有一个列表,列出抓到的包有哪些

4.fiddler 右边就是包的详情.(点击左边某个包)

可以使用 ctrl + a 全选左侧的抓包结果, delete 键清除所有被选中的结果.
首行由http请求的“方法”(methon)、url 、版本号三部分组成.
![]()
这两个方法是较为重要的方法!!
GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.
打开 Fiddler, 访问 百度主页, 观察抓包结果.
图中标记的就是通过浏览器地址栏发送的 GET 请求.

GET 请求的特点
POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).


POST 请求的特点
这些方法不需要记,也就是说不需要去遵守场景要求,没有所谓的约束, 它们能做的get 和 post 也能做到.
首先,GET 和 POST 没有本质区别!!!(双方可以替换对方的场景)
虽没有本质区别,但是在使用习惯上,还是存在差异的.
1.GET 习惯把传递的数据放到query string 中,POST则是习惯把传递的数据放到body中.
(情况并非绝对!!!,当然还是建议大家这样操作.)
2.语义上的差异.
GET 大多数还是用来获取数据.
POST 大多数还是用来提交数据.(登录+上传)
网上一些错误说法:
1.GET请求传递数据数据不安全. POST请求传递数据更安全.
依据就是:如果使用GET请求来实现登录,点击登录的时候,会把用户名和密码放到 url 中,进一步显示到浏览器地址栏里.(就被别人看见了). 相对于POST,则是放在body中,不会在界面上显示,所以更安全.
这种说法,也就能忽悠下小白了,对于黑客来说成本并不高,就如下图:用fiddler抓包得到的,用户名和密码,安不安全的关键是加密!!!
![]()
2. GET 请求能传递的数据量有上限,POST传递的数据量没有上限.
这个说法是上古时期的一个遗留问题,早起版本的浏览器硬件资源非常匮乏,针对GET请求的url 做出了限制.实际上,RFC标准文档中并没有明确规定url 能有多长. 目前,浏览器和服务器的实现过程中,url可以非常长.
URL,描述了某个资源在网络上所属的位置. 就可以理解成jdbc 里的url. 数据库也算是一种“资源”.

这就很简单,首行的最后就是http 的版本.

header 的整体的格式也是 "键值对" 结构.
每个键值对占一行. 键和值之间使用分号分割
表示服务器主机的地址和端口.
表示 body 中的数据长度.
表示请求的 body 中的数据格式.
表示浏览器/操作系统的属性. 形如
![]()
表示这个页面是从哪个页面跳转过来的. 形如:

可以认为是浏览器在本地存储的一种机制.

浏览器的数据来自于服务器. 而且浏览器的后续操作也是要提交给服务器的.
服务器就相当于一个网站的各种核心数据.
程序在运行过程中,也会有一些数据,需要在浏览器这边存储,并且在后续请求的时候数据可能需要再发给服务器. (上次登录时间、上次访问时间、用户的身份信息、累计访问次数.....)


空行 和 正文 boby 就不在演示了!!! 用fiddler抓包工具观察一下就可以!!非常简单


响应报头的格式跟请求报文格式基本一致,也就是 Content-Type 中的body数据格式不一样.

1.直接在浏览器地址栏输入URL

2.通过form表单来触发GET / POST 请求
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>hello</title>
- </head>
- <body>
- <form action="http://www.sogou.com/abc.html" method="get">
- <input type="text" name="key1">
- <input type="text" name="key2">
- <input type="text" name="key3">
- <input type="submit" value="提交">
- </form>
- </body>
- </html>
3.这种也是最简单的借助第三方工具 --> postman


思考问题: 为什么 HTTP 报文中要存在 "空行"?
因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者是 "报头和正文之间的分隔符".
HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题".