Accept 声明我能收什么
Accept 用媒体类型列表告诉服务端客户端希望接受什么格式的响应,可以给每种类型附加 q 权重表达偏好,取值在 0 到 1 之间,默认 1。服务端据此选择一种表示返回,并在响应头 Content-Type 里说明最终选的是什么。它是内容协商的请求侧半边,方向与 Content-Type 恰好相反:Accept 说我想要什么,Content-Type 说我发的或发的是这个。
基本信息
| 请求头名 | Accept |
|---|---|
| 作用 | 声明客户端可接受的响应媒体类型 |
| 规范 | RFC 9110 第 12.5.1 节 |
| 语法 | 媒体类型列表,可带分号参数与 q 权重 |
| 默认值 | 不发送时通常按接受任意类型处理 |
| 失败响应 | 服务端无法返回任何可接受的类型时回 406 Not Acceptable |
协商 JSON 与偏好的错误格式
协商 JSON 与偏好的错误格式
curl -si https://api.example.com/report -H 'Accept: application/json;q=1.0, text/html;q=0.5'
# 服务端命中 application/json,因为它的 q 权重更高
curl -si https://api.example.com/report -H 'Accept: application/json' | grep -i content-type # 确认实际返回类型
curl -si https://api.example.com/report -H 'Accept: application/xml' | head -1 # 无法满足时应回 406
curl -sI https://api.example.com/report | grep -i vary # 多表示场景应带 Vary: Accept写法与语义
| 写法 | 含义 | 注意点 |
|---|---|---|
| application/json | 只接受 JSON | 最常用,语义明确 |
| application/json;q=1.0, text/html;q=0.5 | JSON 优先,可以退让到 HTML | 权重高的优先,服务端按权重选择 |
| text/html;q=0 | 明确不接受 HTML | q 等于 0 表示不接受,不是最优先 |
| */* | 接受任意类型 | 常用于脚本与探测工具 |
| application/* | 接受该大类下的任意子类型 | 适合只关心大类而不限定具体格式 |
与 Content-Type 的区别
| 对比项 | Accept | Content-Type |
|---|---|---|
| 出现位置 | 请求头 | 请求头与响应头都有 |
| 描述对象 | 我希望收到什么格式 | 我实际发送的是什么格式 |
| 方向 | 客户端到服务端 | 发送方到接收方 |
| 排查场景 | 406 时看它 | 415 时看它 |
典型使用场景
- 接口同时提供 JSON 与 XML 表示时表达偏好
- 排查 406 报错:确认客户端声明的类型与服务端能提供的是否有交集
- 前端按需请求不同格式:图表数据要 JSON,导出要 CSV
- 爬虫与自动化脚本声明明确类型,避免服务端返回默认 HTML
- 多表示场景核对是否配置了 Vary,防止缓存串格式
排 406 时先核对服务端支持的媒体类型列表,再看客户端声明的列表,两者取交集为空才会触发 406。多数情况是客户端写了一个服务端从未实现的类型。