Content-Type 是什么
Content-Type 描述消息体的媒体类型与编码参数:请求里它说明提交的数据是什么格式,响应里它告诉客户端该如何解析。JSON、表单、多部分混合提交、字符集与分隔符,全靠这个头区分。它是内容协商的关键一环:服务端要按它选择解析器,客户端要按它选择解码方式,任何一端写错都会直接导致解析失败或数据错乱。
基本信息
| 名称 | Content-Type(RFC 9110 §8.3,媒体类型注册见 IANA) |
|---|---|
| 作用 | 标注消息体的媒体类型与编码参数 |
| 关键参数 | 字符集用于文本,分隔符用于混合提交,范围类型用于分段响应 |
| 写在哪 | 请求体存在时写在请求头,响应有内容时写在响应头 |
| 与嗅探关系 | 缺失时部分实现会猜测,配合禁止嗅探头可避免安全风险 |
典型使用场景
- 接口调用:声明结构化数据并以字符集指明编码,避免中文乱码
- 页面表单:使用表单编码提交键值对,简单场景最省事
- 文件上传:使用多部分混合提交,分隔符由客户端生成并写入头部
- 静态资源响应:让浏览器按类型选择渲染或下载行为
- 分段下载:配合范围请求返回部分内容,同时说明返回的是哪一段
三种常见请求体类型
三种常见请求体类型
结构化数据; 字符集声明为 utf-8 # 接口最常用,注意必须显式声明否则可能被按表单解析
表单编码; 键值对用等号与连接符拼接 # 传统页面表单,不支持嵌套结构
多部分混合; 头部带分隔符参数 # 文件上传,分隔符必须与报文正文中的一致常见媒体类型速查
| 类型 | 用途 | 注意 |
|---|---|---|
| 结构化数据 | 接口请求与响应 | 必须显式声明,否则可能被按表单解析 |
| 表单编码 | 传统页面表单 | 不支持嵌套结构,复杂值需自行序列化 |
| 多部分混合 | 含文件上传的提交 | 分隔符与正文不一致会直接解析失败 |
| 纯文本 | 日志上报、简单输出 | 默认字符集可能有歧义,建议写明 |
| 二进制流 | 文件下载 | 建议配合内容处置头指定文件名 |
排查要点
- 先确认请求头里到底声明了什么,用能打印完整请求的命令行工具看一眼最直观
- 对比响应体实际格式与声明是否一致,声明与内容不符会让客户端解析出错
- 文本类内容建议统一声明字符集,跨系统传递时乱码问题大多来源于此
- 上传失败优先怀疑分隔符:手工拼接请求体时最容易与实际正文不一致
内容缺失类型时,部分实现会按默认类型猜测或做内容嗅探。安全上应同时下发禁止嗅探的响应头,避免浏览器把上传的文件当成脚本执行。
用文本类型发送结构化数据会被严格的接口直接拒绝,表面看是请求失败,实际只是头部声明错误;反过来把二进制当文本声明,接收方拿到的数据会被破坏。
四个实践要点
- 客户端与服务端要约定统一的类型,跨团队接口应在文档里明确写出来
- 响应体含非英文字符时统一声明字符集,避免下游按默认编码解析出乱码
- 上传接口要同时校验声明类型与实际内容,只信声明会被伪装文件绕过
- 内网调用同样要写清类型,省略头部在跨语言实现中最容易出问题