HTTP 协议基础:请求方法、状态码、请求头、响应体
做接口开发,HTTP 协议是咱们吃饭的家伙。你写的每一个自动录入脚本,本质上都是在跟 HTTP 打交道。我个人习惯把 HTTP 理解成一套“快递协议”——客户端打包一个请求包裹(方法、头、体),服务器收到后拆包处理,再给你回一个响应包裹(状态码、头、体)。这套规则搞不清楚,接口调试就会变成玄学。
请求方法——接口的“动词”
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) 打出来看两眼,确认结构后再写解析逻辑。这能省下不少调试时间。