首页/网络/协议速查/Accept 内容协商
HTTP 头与缓存70 条

Accept 内容协商

声明客户端可接受的响应媒体类型(MIME),可带 q 权重表达偏好;服务端据此选择表示。

协议速查网络更新于 2026-10-13

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.5JSON 优先,可以退让到 HTML权重高的优先,服务端按权重选择
text/html;q=0明确不接受 HTMLq 等于 0 表示不接受,不是最优先
*/*接受任意类型常用于脚本与探测工具
application/*接受该大类下的任意子类型适合只关心大类而不限定具体格式

与 Content-Type 的区别

对比项AcceptContent-Type
出现位置请求头请求头与响应头都有
描述对象我希望收到什么格式我实际发送的是什么格式
方向客户端到服务端发送方到接收方
排查场景406 时看它415 时看它

典型使用场景

  • 接口同时提供 JSON 与 XML 表示时表达偏好
  • 排查 406 报错:确认客户端声明的类型与服务端能提供的是否有交集
  • 前端按需请求不同格式:图表数据要 JSON,导出要 CSV
  • 爬虫与自动化脚本声明明确类型,避免服务端返回默认 HTML
  • 多表示场景核对是否配置了 Vary,防止缓存串格式
排 406 时先核对服务端支持的媒体类型列表,再看客户端声明的列表,两者取交集为空才会触发 406。多数情况是客户端写了一个服务端从未实现的类型。

易错点

  • 把 q 值写反,误以为数字越大越不想要,结果协商出与预期相反的格式
  • 声明了通配符就以为一定拿到可解析的格式,服务端返回的默认类型客户端可能处理不了
  • 多表示接口没有配置 Vary: Accept,缓存把 HTML 版本发给了期望 JSON 的客户端
  • 只在浏览器里验证过接口,忽略了脚本与移动端会发送不同的 Accept,上线后出现零星报错

数据来源与参考

  • RFC 9110 §12.5.1 Accept

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌