HTTP 协议基础:请求方法、状态码、请求头、响应体

做接口开发,HTTP 协议是咱们吃饭的家伙。你写的每一个自动录入脚本,本质上都是在跟 HTTP 打交道。我个人习惯把 HTTP 理解成一套“快递协议”——客户端打包一个请求包裹(方法、头、体),服务器收到后拆包处理,再给你回一个响应包裹(状态码、头、体)。这套规则搞不清楚,接口调试就会变成玄学。

HTTP 请求-响应流程 客户端 (自动录入脚本) 请求方法 GET/POST/PUT/... 请求头 Content-Type / Auth 请求体 JSON / FormData 服务器 处理请求 状态码 200 / 201 / 404 / 500 响应头 Content-Type / Set-Cookie 响应体 JSON / 错误信息 请求与响应 —— 成对出现 每次请求必须对应一个响应

请求方法——接口的“动词”

HTTP 定义了一组“方法”,告诉服务器你想对资源做什么。在自动录入场景里,最常用的就是 GET 和 POST,偶尔用 PUT 更新、DELETE 删除。我建议你把这个表记牢:

方法作用是否幂等是否安全自动录入常见场景
GET获取资源是是查询录入任务进度、拉取配置
POST创建资源否否提交录入数据、创建任务
PUT全量替换资源是否更新整条录入记录
PATCH部分更新资源否否修改录入字段(状态、备注)
DELETE删除资源是否删除已作废的录入任务

注意那个“幂等”——多次调用效果相同。我踩过一个坑:用 POST 重复提交表单,结果数据库里插了两条完全相同的数据。后来老老实实改成“先 GET 查重,再 POST”,或者用 PUT 来保证幂等。

小技巧:设计 API 时,创建用 POST,更新用 PUT 或 PATCH。如果业务上要求“客户端只发一次,服务器保证只生效一次”,可以加一个 idempotency-key 请求头。我在对接银行接口时见过这种设计,挺实用的。

状态码——服务器的“回应表情”

状态码是服务器给你的“表情包”,一看就知道请求结果。我个人把它分五类:

  • 1xx(信息):很少直接遇到,比如 101 切换协议(WebSocket 升级)。
  • 2xx(成功):200 OK、201 Created、204 No Content。自动录入最常打交道的就是这几个。
  • 3xx(重定向):301/302 跳转。如果你发现返回了 302,先检查是不是没带 Cookie 或者 URL 写错了。
  • 4xx(客户端错误):400 参数不对、401 未登录、403 没权限、404 路径不存在。这是你最需要仔细看的错误码。
  • 5xx(服务端错误):500 内部错误、502 网关超时、503 服务不可用。碰到这些,先检查服务器是不是挂了。

我写过一张对照表,你看看能不能用得上:

状态码含义自动录入中的典型场景
200请求成功,响应体包含数据查询录入结果,返回 JSON
201创建成功提交数据后,服务器返回新资源的 ID
204成功但无响应体删除操作,或某些更新操作不返回内容
400请求参数错误必填字段缺失、JSON 格式不对
401未认证Token 过期或没传 Authorization 头
403无权限账号权限不足,没法录入该业务线数据
404资源不存在录入目标 URL 写错了,或者数据已被删
409冲突重复数据、版本号不匹配
422语义错误字段值不合法(比如日期格式)
429请求频率过高短时间发了太多请求,被限流
500服务器内部错误后端代码报错,联系运维吧
502网关错误代理服务器无响应,常见于 Nginx 后端挂掉
503服务暂时不可用服务器过载或维护中
我曾经犯过的错:看到 201 就以为一定有响应体,结果解包时报 JSON 解析错误。后来才意识到,201 可以没有响应体(遵循 204 风格),也可能是空白。写代码一定要先判断响应状态码再解析 body。

请求头——接口的“元数据”

请求头里装的是一些附加信息,告诉服务器“我是谁”、“我要什么格式”、“我给你的是啥”。自动录入开发中,下面几个头你十有八九得用到:

  • Content-Type:声明请求体的格式。最常见的是 application/json 和 multipart/form-data(上传文件)。千万别忘了它,否则服务器不知道怎么解析。
  • Authorization:放 token 的地方。格式一般是 Bearer <token>,也有的用 Basic Auth。我习惯在代码里从配置读 token,拼好再塞进请求头。
  • Accept:告诉服务器你期望的响应格式。大部分情况下设成 application/json 就行。
  • User-Agent:标注客户端身份。有的接口会校验这个,我一般设成 AutoUploadBot/1.0 方便排查。
  • Cookie:如果接口用 Session 认证,需要带上 Cookie。自动录入脚本可以模拟浏览器登录后的 Cookie。
  • X-Requested-With:很多后端用它判断是不是 AJAX 请求,顺手加上 XMLHttpRequest 可以避免被拒。
关键点:Content-Type 和 Authorization 几乎是必传的头。我见过不少新手忘了写 Content-Type,服务器直接返回 400 说“请求格式不支持”,其实加个头就搞定了。

响应体——接口的“数据包”

响应体就是服务器给你的具体数据。现在最流行的是 JSON,格式清爽,解析也简单。一个完整的成功响应长这样:

{
  "code": 0,
  "message": "success",
  "data": {
    "id": 12345,
    "status": "pending",
    "created_at": "2025-03-10T14:30:00Z"
  }
}

需要注意的是,不同团队对响应体的设计风格不一样。有的把真正数据直接丢在顶层,有的包一层 data 字段。我建议你在写自动录入脚本前,先拿一个真实的请求试一下,看看响应体结构,免得解包解错。

错误情况下的响应体一般会带一个错误说明:

{
  "code": 1001,
  "message": "参数校验失败:name 字段不能为空",
  "details": {
    "field": "name",
    "reason": "required"
  }
}

碰到这种错误,别硬解 data,先判断 code 或者 message 字段,然后记下来方便排查。我曾经遇到一个接口,每次返回 200 但 code 是 500,一看就是内部错误被外层 catch 了——这种情况要多留个心眼。

我的习惯:编写自动录入脚本时,先把响应体用 print(response.text) 打出来看两眼,确认结构后再写解析逻辑。这能省下不少调试时间。