HTTP协议是应用层协议,基于TCP/IP工作,用于客户端和服务器间传输超文本数据。HTTP报文由请求/响应行、报头和正文组成,通过空行分隔。请求方法包括GET(获取资源)和POST(提交数据),GET参数通过URL传递,POST通过请求体传递。响应包含状态码和响应数据。URL编码确保特殊字符正确传输。使用工具如Fiddler可分析HTTP流量,Postman可构造请求。HTTP具有无状态、明文传输等特点,是互联网核心协议之一
1.http
HTTP (Hyper Text Transfer Protocol 超文本传输协议) , 是应用层协议 , 基于 TCP/IP 协议族工作 , 用于客户端和服务器之间传输超文本(如 HTML,图片,JSON 等) , 是互联网核心协议之一
核心特点 : 无状态 , 明文传输 , 基于请求-响应模型
1.1 http 协议格式
以下 用 fiddler 抓包
简单设置一下fiddler
简单介绍 一下fiddler
|--------|----------------------------------------------------------------|
| 颜色 | 标识含义 |
| 红色 | 表示 HTTP 状态错误(对应 4xx、5xx 等错误状态码) |
| 黄色 | 表示 HTTP 状态需要身份认证(对应 401、407 等认证类状态码) |
| 灰色 | 两种场景:1. 数据流类型为 CONNECT(HTTPS 连接建立阶段的请求)2. 响应资源类型为图片(如 JPG、PNG) |
| 紫色 | 响应资源类型为 CSS 文件 |
| 蓝色 | 响应资源类型为 HTML 文件(网页主体) |
| 绿色 | 响应资源类型为 Script 文件(如 JavaScript) |
| 黑色 | 响应资源类型为对象数据(如 JSON、XML 等) |
①HTTP 请求

- 首行: 方法+url+版本
- Header : 请求属性 , 冒号分割的键值对 ; 每组用 \n 分隔 ; 遇到空行表示 Header 部分结束
- Body : 空行后面的内容都是 Body ; Body 允许为空 ; 如果 Body 存在 , 则在 Header 中会有一个 Content-Length 来标识 Body 长度
②HTTP 响应

- 首行 : 版本号+状态码+状态码解释
- Header : 请求的属性 ; 用冒号分割的键值对 ; 每组属性之间用 \n 分割 ; 遇到空行表示 Header 部分结束
- Body : 空行后面的内容都是 Body ; Body 允许为空 ; 如果 Body 存在 , 则在 Header 中会有一个 Content-Length 来标识 Body 长度 ; 如果服务器返回了一个 html 页面 , 那么 html 页面内容就在 Body 中
③ 协议格式总结

④ 在 HTTP 报文中空行的作用 : 🤬
- 分隔报文中 Header 和 Body
由于 HTTP 在传输层依赖 TCP 协议 , TCP 是面向字节流的 , 如果没有这个空行 , 就会出现粘包问题
Header 包含请求行/状态行 , 各类首部字段(Content-Type,Cookie 等)
Body 是实际传输的内容(如 HTML,JSON 等)
- 确保报文结构的可读性和解析正确性
🎟️下文详细说明 HTTP 请求和响应的报文的具体内容🎟️
2.HTTP 请求报文(客户端->服务器)

2.1 起始行 :
格式 : 请求方法 + URL + 协议版本
2.1.1 URL
URL (Uniform Resource Locator 统一资源定位符)
协议方案名 : 常见的有 http 和 https 也有其他类型(jdbc:mysql)
登录信息 : 早期层用 user:pass@的形式在 URL 中携带账号密码 , 现因安全问题已经极少使用了
服务器地址 : 域名 , 域名会通过 DNS 系统解析成一个具体的 IP 地址(通过 ping 命令可以看到真实的 IP 地址)
端口号 : 浏览器会自动根据协议来匹配(如 http 为 80,https 为 443)
文件路径 : 表示服务器上的资源的位置
查询字符串(query string) : 是键值对结构 , 键值对之间使用&分隔 , 键和值之间使用=分隔
片段标识符 : 用于页面内的锚点跳转 (格式为#xxx)
① 使用 ping 命令查看域名对应的 IP 地址

②query string
?键=值&键=值
? : 用来分隔 URL 和 querystring
= : 连接键和值
& : 连接键值对的
③URL 中可省略的部分
|----------------|---------------------------------------------------------------------------------------------|
| URL 组成部分 | 省略规则及默认行为 |
| 协议名 | 可省略,默认使用http://(注:部分现代浏览器会自动升级为https,但标准默认是http) |
| IP 地址 / 域名 | 在 HTML 标签(如img/link/script/a的src/href )中可省略,默认与当前 HTML 所在的服务器 IP / 域名一致 |
| 端口号 | 可省略,http协议默认用 80 端口,https协议默认用 443 端口 |
| 带层次的文件路径 | 可省略,默认等价于/(根路径),多数服务器会自动访问根路径下的/index.html(首页文件) |
| 查询字符串 | 可省略,省略后不向服务器传递额外参数 |
| 片段标识 | 可省略,省略后不进行页面内锚点跳转 |
补充 : URL 的省略规则是为了简化书写 , 实际使用需要注意使用场景限制 :
域名省略仅适用于同域名资源引用
④URLencode(URL 编码)
URL 编码是一种将 URL 中 "非安全字符" 转换为特定格式的规则 , 目的是避免字符冲突 , 确保 URL 能正确传输
转义规则 : 将需要转码的字符转为 16 进制 , 然后从左向右取 4 位(不足 4 位直接处理掉) , 每 2 位做 1 位 , 前面加上% , 编码成%XY 的格式
需要转码的字符 :
- 特殊字符 : 空格 & = ? # 等(这些是 URL 结构的字符 , 直接使用会破坏原来的语义)
- 非 ASCLL 字符 : 中文 @ $ 等
- 控制字符 : 不可打印字符
示例 : 以字符 国 为例(UTF-8 为E59BBD , 6 位 十六进制) , 转码后 :%E5%9B ; 以字符 # 为例 (ASCLL 为 23 , 2 位十六进制) , 转码后 : 无有效编码(直接丢弃该字符的转码请求)
urldecode 就是 urlencode 的逆过程
2.1.2 方法(method)
HTTP 方法 , 是客户端向服务端发送请求的动作指令 , 用于指定对目标资源的操作类型 ; 在 RESTfull API 设计和 Web 开发中(SpringBoot 后端)

此处只详细讲部分方法 , 后续方法会通过 SpringBoot 内容来详细讲解
🎟️① GET 方法(最常用)

作用:获取资源(只读操作) , 从服务器查询并返回指定资源
特点:
- 幂等(多次请求结果相同) , 安全(不修改服务器数据)
- 请求参数通过**查询字符串(URL?key=value)**传递 , 长度有限制
- 首行 第一部分为 GET ; URL 的 query string 内容可以为空也可以不为空 ; header 部分有若干个键值对结构 ; body 部分为空
示例 : 在浏览器中直接输入 URL 会发送一个 GET 请求 或者 HTML 中的 link , img , script 标签 也会触发 GET 请求 ;
🎟️② POST 方法(常用)

作用 : 创建资源 , 向服务器提交数据以生成新资源
特点 :
- 非幂等(多次请求可能创建多个资源)
- 请求参数通过请求体 (Request Body) 传递 , 支持复杂数据 (如 JSON,表单) , 无长度限制
- 首行 第一部分为 POST ; URL 的 query string 一般为空(也可以不为空) ; header 部分有若干键值对结构 ; body 部分一般不为空
🎟️③ POST 和 GET 区别
- 语义不同 : GET 一般用于获取数据 ; POST一般用于提交数据
- GET 的 Body 一般为空 , 需要传递的数据通过 query string 传递 ; POST 的 query string 一般为空 , 需要传递的数据通过 Body传递
- GET 请求一般是幂等 的 , POST 请求一般是不幂等的(幂等 : 多次请求得到的结果一样)
- GET 可以被缓存 , POST 不能被缓存(与幂等相关)
补充 :
2.1.3 协议版本
主流为 HTTP/1.1,也支持 HTTP/2,格式固定为「HTTP / 主版本号。次版本号」
实例 :
GET /index.html HTTP/1.1
POST /api/login HTTP/1.1
🎟️2.2 报头(header)
格式 : 键值对结构(为 Key: Value 键值对,每组占一行,末尾以 \r\n 结束)
|--------------------|----------------------------------|---------------------------------------------------------------------------|
| 头部字段 | 作用 | 实例 |
| Host | 指定服务器主机的地址和端口 | Host: job.xjtu.edu.cn |
| Content-Length | 正文长度(字节数) | Content-Length: 45 |
| Content-Type | 正文数据格式(仅 POST/PUT 等有正文时需要指定) | application/json(JSON 格式)、application/x-www-form-urlencoded(表单格式) |
| User-Agent(UA) | 客户端标识(浏览器/操作系统信息) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 |
| Refere | 跳转来源页面 URL(直接输入地址时无此头部) | Referer:http://job.xjtu.edu.cn/companyLogin.do |
| Cookie | 客户端存储身份标识的信息 | JSESSIONID=D628A75845A74D29D991DB47A461E4FC |
| Accept | 客户端支持的响应数据格式 | Accept: text/html,application/json |
2.3 空行
头部结束后必须跟一个空行(仅 \r\n),用于明确分隔头部和正文。即使无正文,空行也不可省略,否则服务器会解析失败(避免 TCP 粘包问题)
2.4 正文(Body)
可选性:GET 方法无正文(参数通过 URL 传递),POST、PUT 等方法需通过正文提交数据
格式规则 :正文格式由 Content-Type 头部指定 :
- 表单格式 (
application/x-www-form-urlencoded):username=hgtz2222&password=222222222- JSON 格式 (
application/json):{"username":"123456789","password":"xxxx","code":"jw7l"}- 文件上传格式 (
multipart/form-data): 含边界符分隔文件与普通字段,如:WebKitFormBoundary8d5Rp4eJgrUSS3wT分隔 PDF 文件数据
3.HTTP 响应报文(服务器->客户端)

3.1 起始行
格式 : 版本协议 + 状态码 + 状态描述
3.1.1 状态码

补充
🎟️3.2 报头(Header)
格式 : 与请求报头类似 , 为 Key: Value 键值对,每组占一行,末尾以 \r\n 结束
|--------------------|-------------------------|---------------------------------------------------------------------------------------|
| 头部字段 | 作用 | 实例 |
| Server | 服务器软件类型及版本 | Server: YxlinkWAF , Server: Nginx/1.21.0 |
| Content-Type | 正文数据格式(含字符编码) | text/html;charset=UTF-8 , application/json;charset=utf-8 |
| Content-Length | 正文长度(字节数) | Content-Length:120 |
| Date | 响应发送时间(GMT 格式) | Date: Fri,29 Sep 2017 05:10:13 GMT |
| Set-Cookie | 向客户端设置 Cookie(状态管理) | Set-Cookie:gitee-session-n=M1Rhbk1QUUxQdWk1VEZVQ1BvZXYybG13ZUJFNGR1V0pSYTZyTllE |
| Location | 重定向地址(仅 3xx 状态码时存在) | Location:https://gitee.com/HGtz2222 |
| Cache-Control | 缓存策略 | Cache-Control:max-age=3600(缓存 1 小时) |
3.3 空行
与请求报文一致,头部结束后必须跟空行(仅 \r\n),用于分隔头部与正文,不可省略
3.4 正文(Body)
可选性:状态码 204(No Content)时无正文,其他状态码可返回数据(如 HTML、JSON、图片等)
格式规则 :正文格式由 Content-Type 头部指定,文档中常见格式:
text/html:HTML 页面内容(如网页源码)application/json:JSON 格式数据(如接口响应{"code":200,"message":"success"})- 二进制格式:图片(
image/jpeg)、文件(application/pdf)等

🎟️4.构造 HTTP 请求
推荐使用 PostMan
① 完整构造步骤
新建请求:打开 PostMan,点击左侧「+」号新建请求标签页
基础配置:
- 下拉选择请求方法(GET/POST/PUT/DELETE 等)
- 输入完整 URL(如
https://localhost:8080/api/user/login)
参数配置:
- GET 请求:在「Params」标签页添加键值对(自动拼接至 URL 后,如
userId=1001) - POST/PUT 请求:
普通表单:切换至「Body」→ 勾选「x-www-form-urlencoded」,添加参数
JSON 格式:「Body」→ 「Raw」→ 选择「JSON」,输入 JSON 请求体(如{"username":"admin","password":"123456"})
文件上传:「Body」→ 「Form Data」,将参数类型改为「File」,选择本地文件
请求头配置 :在「Headers」标签页添加键值对(如Content-Type: application/json、Authorization: Bearer xxx)
发送与查看:点击「Send」按钮,在下方「Response」面板查看响应状态码、响应体(格式化展示)

注意 : 由于作者抓包工具没设置好 , 有些场景难以复现





