目录
1. HTTP协议的概念
HTTP(超文本传输协议)是互联网上应用最广泛的应用层协议,用于在客户端和服务器之间传输超文本及其他数据。
这里萌新就会有疑问,什么是超文本?
文本
主要的数据为字符串,可以在UTF-8、GBK等字符编码表中找到合法的字符表示。
超文本
超文本不仅包含字符串,还可以嵌入图片、链接、音频、视频等非文本数据。超文本的核心是超链接,允许用户通过点击链接跳转到其他文档或资源,典型代表是HTML。
富文本
富文本是一种可以包含多种格式(如字体、颜色、表格、图片等)的文本形式,常见的应用场景包括Word文档、电子邮件、网页编辑器等
2. HTTP协议的工作流程
HTTP协议是一种基于请求-响应模型的通信协议,最主要的应用场景—网站,最常见的就是浏览器和服务器之间的传输数据,客户端(pc端,移动端)和服务器之间的数据传输
HTTP协议交互的过程,就是典型的一问一答型
建立连接:客户端通过TCP/IP与服务器建立连接。
发送请求:客户端发送HTTP请求报文。
处理请求:服务器解析请求并生成响应。
返回响应:服务器发送HTTP响应报文。
关闭连接:关闭连接
3. HTTP协议的报文格式
3.1 抓包工具
抓包工具:抓包工具本质上就是一个“代理程序”,能够获取网络上传输的数据并显示出来,可以给我们在日常开发的时,提供一些参考
这里我们使用的抓包工具是fiddle软件,这个软件功能很强大,最简单的应用就是抓包,还可以进行弱网测试之类操作,在日常工作中经常使用这个软件
比如我们打开百度搜索界面的时候,会在fiddle中会显示,抓到的数据包,你的电脑上任何一个程序,只要使用了HTTP/HTTPS协议,都会被fiddle捕获到,
我们可以观察到,打开一个网站,客户端和服务器之间的交互不止一条,而是很多次
比如说,第一次交互是为了拿到这个页面的HTML,第二次交互为了拿到CSS,JS等数据,执行js的时候有可能会出发很多的http请求,出发更多的交互,获取更多的数据
右上角为请求明细,左下角为响应明细,一般会对返回的响应进行压缩(节省带宽),请求不会压缩,在传输数据的时候,压缩和解压缩都是需要消耗资源和时间的
3.2 HTTP请求格式
HTTP请求包含4个部分
1. 请求行(Request Line)
格式:<方法> <请求URI> <HTTP协议版本>
GET https://www.baidu.com/?tn=15007414_3_dg HTTP/1.1
方法:指定操作类型(如GET、POST等)。
请求URI:目标资源路径(可包含查询参数,如
/path?key=value
)。协议版本:常见的版本—HTTP/1.1
2. 请求头(Headers)
键值对的格式
头部字段 | 作用 |
---|---|
Host |
服务器域名(必填,HTTP/1.1强制要求) |
User-Agent |
客户端标识(如浏览器或curl) |
Accept |
声明客户端可处理的响应类型(如text/html 、application/json ) |
Content-Type |
请求体的数据类型(如application/json 、multipart/form-data ) |
Content-Length |
请求体的字节长度(POST/PUT时需要) |
Authorization |
认证信息(如Bearer Token) |
Cookie |
发送给服务器的Cookie数据 |
举例:
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="9", "Not?A_Brand";v="8"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.7021 SLBChan/10 SLBVPV/64-bit
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.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
从第二行开始,一直到后面都是请求头,其中每一个键值对占一行,键和值之间使用空格分隔
3. 空行
请求头的下面会有一行空行,表示结束
4. 请求体(Body)
http的载荷部分,有的请求中存在body,有的则不存在
常见的格式:
application/x-www-form-urlencoded:表单数据
application/json:JSON格式
multipart/form-data:文件上传
举例:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 28
{"name":"John","age":25}
3.3 HTTP响应格式
HTTP响应的基本格式,也是分为4个部分
1. 状态行(Status Line)
格式:<HTTP协议版本> <状态码> <状态描述>
举例:HTTP/1.1 200 OK
协议版本:如
HTTP/1.1
或HTTP/2
。状态码:3位数字,表示请求结果(如
200
表示成功)。状态描述:状态码的文本说明(如
OK
、Not Found
)。
2. 响应头(Headers)
同样是根据键值对返回信息
头部字段 | 作用 |
---|---|
Content-Type |
响应体的数据类型(如 text/html 、application/json ) |
Content-Length |
响应体的字节长度(重要,尤其对二进制数据) |
Server |
服务器软件信息(如 Apache/2.4 ) |
Date |
响应生成的时间(GMT格式) |
Set-Cookie |
设置客户端的Cookie(用于会话管理) |
Cache-Control |
控制缓存行为(如 no-cache 、max-age=3600 ) |
Location |
重定向目标URL(状态码为3XX时使用) |
3. 空行
请求头的下面会有一行空行,表示结束
4. 响应体(Body)
内容:服务器返回的实际数据(HTML、JSON、图片等)。
格式:由 Content-Type 决定,常见类型:
text/html:网页内容。
application/json:API响应数据。
image/png:二进制图片数据。
4. URL(统一资源定位符)
URL:互联网上用于标识和定位资源的一段字符串,主要的作用就是定位资源
4.1 URL的组成
https://www.example.com:8080/path/to/resource?query=value#fragment
\___/ \_____________/\___/\_______________/\_________/ \_______/
| | | | | |
协议 主机名 端口 路径 查询参数 片段标识
- 协议(Scheme):指定访问资源使用的协议
- 主机名(Host):服务器的域名或IP地址
- 端口号(Port):服务器监听的端口号,如果不写端口号,会有一个默认的端口号
- 路径(Path):服务器上的资源路径
- 查询参数(Query String):以
?
开头,包含key=value
对,多个参数用&
连接。 - 片段标识(Fragment):以
#
开头,用来标识当前页面的某个部分
通过IP地址知道服务器在哪,通过端口号知道程序是哪个,通过路径知道访问那个资源
查询参数,是客户端给服务器传递信息的重要途径,这里数据的组织方式是键值对
根据IP地址,端口号,路径,查询参数,就可以描述出一个网络资源的位置
4.2 URL encode
在URL中,有一些数据字符,被保留可以正常使用,有一些字符不能被正常表示,如中文,空格这类的数据,必须进行编码,否则服务器会解析错误,出现一定的bug
bug举例
原始字符串:
https://example.com/files/document#1.pdf
比如这里#并不是表示片段表示的出现,而是路径中的参数,避免出现歧义,则需要编码
编码后:
https://example.com/files/document%231.pdf
将 # -> %23 (避免被误认为片段标识符)
URL 编码规则
格式:%
+ 2位十六进制数(对应字符的 ASCII 或 Unicode 编码)。
字符 | 编码后 |
---|---|
空格 | %20 |
/ |
%2F |
? |
%3F |
= |
%3D |
& |
%26 |
# |
%23 |
举例:
原始URL:
https://example.com/search?q=HTTP 协议&page=1
编码后:
https://example.com/search?q=HTTP%20%E5%8D%8F%E8%AE%AE&page=1
在开发的时候,如果URL中的查询参数中出现中文和特殊字符,进行编码是非常有必要的