4. HTTP协议基础:请求与响应结构、常见方法、状态码含义
抓包分析,说白了就是看HTTP报文。你想想看,客户端和服务端之间到底说了什么?所有秘密都藏在请求和响应里。这一章,我把最核心的东西给你拆开讲。
4.1 HTTP请求结构:客户端到底发了什么?
一个HTTP请求,由三部分组成:请求行、请求头、请求体。我习惯用Wireshark抓包时,先看请求行,一眼就能知道对方想干嘛。
GET /api/user?id=123 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: application/json
(请求体为空)
请求行里,第一行就是方法、路径和协议版本。后面跟着一堆键值对,叫请求头。空行之后是请求体,GET方法一般没有体。
4.2 HTTP响应结构:服务器怎么回答?
响应和请求是对称的。响应由状态行、响应头、响应体组成。状态行里最重要的就是状态码。
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 123
Date: Mon, 10 Mar 2025 08:00:00 GMT
{"status":"success","data":{...}}
状态行告诉你协议版本、状态码和原因短语。响应头里Content-Type特别关键——它告诉客户端怎么解析返回的数据。我曾经调试过一个接口,返回了200但页面空白,一看Content-Type写的是text/plain,前端解析JSON失败。
4.3 常见HTTP方法:GET/POST/PUT/DELETE
这四种方法,你抓包时天天见。我整理了一张对比表,方便你对照。
| 方法 | 语义 | 请求体 | 幂等性 | 典型场景 |
|---|---|---|---|---|
| GET | 获取资源 | 无 | 是 | 查询数据、加载页面 |
| POST | 创建资源 | 有 | 否 | 提交表单、上传文件 |
| PUT | 更新/替换资源 | 有 | 是 | 更新用户信息 |
| DELETE | 删除资源 | 通常无 | 是 | 删除记录 |
为什么POST不幂等?你想想看,连续两次POST同一个订单接口,会创建两个订单。而GET请求,你刷新一万次,结果都一样。这就是幂等性的区别。
4.4 状态码含义:200/301/404/500
状态码是服务器给你的反馈。我把它分成五类,你记牢了,抓包时一眼就能判断问题方向。
- 1xx(信息):服务器收到请求,继续处理。比如101 Switching Protocols,WebSocket升级时常见。
- 2xx(成功):请求被成功处理。200 OK最常见,201 Created表示资源创建成功。
- 3xx(重定向):需要进一步操作。301永久重定向,302临时重定向,304未修改(缓存生效)。
- 4xx(客户端错误):请求有问题。400 Bad Request(参数错误),401未授权,403禁止访问,404找不到资源。
- 5xx(服务器错误):服务器内部出问题。500内部错误,502网关超时,503服务不可用。
核心记忆法:2xx是绿灯,3xx是黄灯(换个路走),4xx是你错了,5xx是服务器错了。抓包时看到4xx先检查请求参数,看到5xx先看服务器日志。
我举个例子。有一次线上告警,用户登录一直失败。我抓包一看,返回的是301重定向。原来前端请求的URL是http,服务器强制跳转到https,但前端没处理重定向,导致登录流程中断。嗯,这里要注意:301/302在AJAX请求里,浏览器不会自动跟随,需要你自己处理。
4.5 知识体系总览:一张图看懂HTTP基础
下面这张SVG图,把HTTP请求与响应的核心结构、方法和状态码串起来了。你保存下来,以后抓包时对照着看。
4.6 实战抓包:一眼识别异常
我给你一个真实场景。某天线上反馈,用户点击「提交订单」后页面一直转圈。我打开Wireshark抓包,过滤出该接口的请求。
POST /api/order/create HTTP/1.1
Host: shop.example.com
Content-Type: application/json
Content-Length: 256
{"user_id":123,"product_id":456,"quantity":1}
响应是这样的:
HTTP/1.1 500 Internal Server Error
Content-Type: text/html
Content-Length: 0
看到500,我直接去查服务器日志。发现是数据库连接池满了。嗯,这里要注意:500不一定是你代码的问题,也可能是依赖的服务挂了。抓包能帮你快速定位到「问题出在哪一层」。