HTTP协议基础与RESTful风格:方法、状态码、请求头、响应体
Agent工具调用接口的核心传输载体是HTTP协议。本章从底层原理出发,系统讲解HTTP方法、状态码、请求头与响应体的设计规范,并结合RESTful风格说明如何在Agent接口中正确使用这些元素。
1. HTTP协议请求-响应模型
HTTP协议基于客户端-服务器(C/S)模型,采用无状态、明文传输的请求-响应交互模式。一次完整的HTTP事务包含以下阶段:
- 客户端(Agent/应用)建立TCP连接(默认端口80/443)。
- 客户端发送HTTP请求(请求行 + 请求头 + 可选的请求体)。
- 服务器解析请求,执行逻辑,返回HTTP响应(状态行 + 响应头 + 响应体)。
- 连接关闭或复用(HTTP/1.1默认Keep-Alive)。
2. HTTP方法(Methods)
RESTful风格要求每种方法对应一种资源操作。Agent工具调用中常用以下方法:
| 方法 | 语义 | 幂等 | 请求体 | Agent典型用途 |
|---|---|---|---|---|
| GET | 获取资源 | 是 | 否 | 查询工具列表、获取任务状态 |
| POST | 创建资源/触发动作 | 否 | 是 | 调用工具、提交任务 |
| PUT | 整体替换资源 | 是 | 是 | 更新工具配置、覆盖状态 |
| PATCH | 部分更新资源 | 否 | 是 | 修改工具参数、增量变更 |
| DELETE | 删除资源 | 是 | 可无 | 取消任务、注销工具会话 |
设计原则:Agent接口应严格遵循语义化方法。例如,纯查询使用
GET,不要用 POST 做查询(除非请求体过大需用 POST 包裹,此时应明确标注)。
3. HTTP状态码(Status Codes)
状态码是服务端向Agent传递处理结果的数字信号。按大类划分如下:
| 范围 | 类别 | 常用码值 | Agent处理建议 |
|---|---|---|---|
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content | 正常解析响应体;201 指示资源已创建,204 无体需特殊处理 |
| 3xx | 重定向 | 301 Moved, 302 Found, 307 Temporary Redirect | Agent应跟随 Location 头自动跳转(默认最多5次) |
| 4xx | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests | 检查请求格式、认证信息、频率限制;不要盲目重试 |
| 5xx | 服务器错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable | 实现指数退避重试(Exponential Backoff)与熔断 |
必避误区:不要将业务逻辑错误码放在响应体而“硬吃”200状态码。正确的做法是:状态码反映HTTP事务结果,业务状态由响应体中的
code 或 status 字段承载。
4. HTTP请求头(Request Headers)
请求头携带元数据,直接影响服务器解析与安全校验。Agent接口必须关注以下头部:
| 头部 | 作用 | 示例值 | 必选/可选 |
|---|---|---|---|
Content-Type | 声明请求体格式 | application/json | POST/PATCH/PUT 必选 |
Accept | 声明客户端可接受的响应格式 | application/json | 推荐必选 |
Authorization | 身份认证令牌 | Bearer <token> | 认证接口必选 |
X-Request-ID | 链路追踪标识 | uuid-v4 | 强烈推荐;用于日志串联 |
User-Agent | 标识客户端类型 | AgentSDK/1.0 | 推荐;便于服务端识别 |
Cache-Control | 控制缓存行为 | no-cache | 根据场景可选 |
完整请求示例(调用Agent工具)
POST /v1/tools/calculator HTTP/1.1
Host: api.agent.example.com
Content-Type: application/json
Accept: application/json
Authorization: Bearer sk-xxxxxxxxxxxxxxxx
X-Request-ID: 550e8400-e29b-41d4-a716-446655440000
User-Agent: AgentClient/1.0
{
"operation": "add",
"a": 10,
"b": 20
}
5. HTTP响应体与响应头
响应头中的 Content-Type 决定Agent如何解析响应体。标准Agent接口通常返回JSON结构:
HTTP/1.1 200 OK
Content-Type: application/json
X-Request-ID: 550e8400-e29b-41d4-a716-446655440000
X-RateLimit-Remaining: 99
{
"code": 0,
"message": "success",
"data": {
"result": 30,
"execution_time_ms": 2
}
}
响应体规范:推荐使用顶层
code + message + data 结构。 code=0 表示成功,非零值为业务错误码。错误时 data 可为 null 或携带错误详情 details。
6. RESTful资源设计流程
设计一个Agent工具调用接口时,遵循以下5步流程:
- 识别资源:确定Agent要操作的实体(如
任务、工具实例、会话)。 - 规划URL:使用名词复数形式,层级通过
/表达。例:/api/v1/tasks、/api/v1/tasks/{task_id}。 - 分配方法:对照上表为每个端点选择正确的HTTP方法。
- 定义请求/响应Schema:明确必选头、可选头、请求体JSON结构、成功/错误响应结构。
- 指定状态码映射:列出每个端点所有可能的状态码,并附带处理策略(重试、报错、降级)。
7. 常见错误与调试要点
| 错误场景 | 表现 | 解决方案 |
|---|---|---|
缺失 Content-Type | 服务器返回 415 Unsupported Media Type | 在请求头中显式设置 Content-Type: application/json |
Accept 与服务端不匹配 | 服务端返回 406 Not Acceptable | 统一使用 Accept: application/json |
| Token过期被拒 | 返回 401 Unauthorized | 实现Token刷新逻辑,或重新获取凭证 |
| 请求体格式错误 | 返回 400 Bad Request + 错误描述 | 校验JSON合法性,检查字段类型及必填项 |
| 请求过快触发限流 | 返回 429 Too Many Requests + Retry-After | 读取 Retry-After 头,等待指定秒数再重试 |
| 服务端5xx | 返回 503 或 502 | 实行指数退避:初始延迟1s,每次翻倍,最大30s |
8. 调试工具与命令行快速验证
推荐使用 curl 快速验证接口行为:
# GET 请求查询工具状态
curl -s -w "\nHTTP Status: %{http_code}\n" \
-H "Authorization: Bearer sk-your-token" \
-H "Accept: application/json" \
https://api.agent.example.com/v1/tools/calculator/status
# POST 请求调用工具
curl -s -w "\nHTTP Status: %{http_code}\n" \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-token" \
-H "Accept: application/json" \
-d '{"operation":"add","a":10,"b":20}' \
https://api.agent.example.com/v1/tools/calculator
调试技巧:使用
-w "\nHTTP Status: %{http_code}\n" 可以在 curl 输出末尾显示状态码;添加 -v 可查看完整请求/响应头信息,快速定位缺失头部或格式问题。