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方法一般没有体。

我的习惯:抓包时先看请求行的方法和路径,再看Host头。这两个字段能帮你快速定位问题。我曾经遇到一个案例,前端请求路径写成了绝对路径,导致代理服务器解析失败——就是Host头没带对。

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 删除资源 通常无 是 删除记录
避坑指南:我曾经遇到一个项目,前端用GET方法传了很大的JSON数据,结果URL长度超限被截断。记住:GET参数在URL里,有长度限制(浏览器和服务器都有)。POST的数据在请求体里,理论上不限大小。

为什么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请求与响应的核心结构、方法和状态码串起来了。你保存下来,以后抓包时对照着看。

HTTP协议基础知识体系 HTTP协议基础:请求与响应核心结构 HTTP 请求结构 请求行 GET /api/user?id=123 HTTP/1.1 请求头 Host: www.example.com 请求体 (POST时携带数据) HTTP 响应结构 状态行 HTTP/1.1 200 OK 响应头 Content-Type: application/json 响应体 {"status":"success"} 发送请求 常见方法 GET - 获取资源(幂等) POST - 创建资源(非幂等) PUT - 更新资源(幂等) DELETE - 删除资源(幂等) 常见状态码 2xx 成功(200 OK) 3xx 重定向(301/302) 4xx 客户端错误(404) 5xx 服务器错误(500) 抓包时:先看请求行和状态行,再查头和体。4xx查请求,5xx查服务器。

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不一定是你代码的问题,也可能是依赖的服务挂了。抓包能帮你快速定位到「问题出在哪一层」。

我的经验:抓包时养成习惯,先看状态码。如果是4xx,仔细检查请求参数和URL。如果是5xx,立刻转去查服务器日志和监控。别在客户端侧死磕服务器错误,浪费时间。