HTTP 请求体常见格式有哪些?表单、JSON、二进制流分别适合什么场景?
简化版
HTTP 请求体格式由 Content-Type 描述。
常见格式包括 application/json、application/x-www-form-urlencoded、multipart/form-data、text/plain、application/octet-stream 等。
JSON 适合结构化 API;表单编码适合简单表单;multipart 适合文件上传;octet-stream 适合单个原始二进制流。
详细版
示例:
POST /users HTTP/1.1
Content-Type: application/json
{"name":"tom","age":18}
如果是传统表单:
Content-Type: application/x-www-form-urlencoded
name=tom&age=18
如果上传文件:
Content-Type: multipart/form-data; boundary=abc
服务端必须根据 Content-Type 选择正确解析器。
如果客户端声明 JSON,却发送表单格式,服务端就可能解析失败或返回 415 Unsupported Media Type。
完整版教学
1. 先明确 Content-Type 的作用
HTTP 请求体本质上是一段字节。
服务端要知道如何解析这段字节,就要看 Content-Type。
例如同样是:
name=tom&age=18
如果按表单解析,它是两个字段。
如果按纯文本解析,它只是一段字符串。
Content-Type 告诉接收方:这段 body 应该按什么媒体类型解析。
2. application/json
JSON 是现代 API 最常用的请求体格式。
示例:
POST /api/users HTTP/1.1
Content-Type: application/json
{"name":"tom","roles":["admin","editor"]}
优点是结构化能力强,数组、对象、数字、布尔值表达自然。
缺点是不能直接高效表达大文件二进制,通常不适合把文件 Base64 塞进 JSON。
3. application/x-www-form-urlencoded
传统 HTML 表单常用这种格式。
Content-Type: application/x-www-form-urlencoded
username=tom&password=123456
字段会做 URL 编码。
它适合简单键值对,不适合复杂嵌套结构和文件。
很多 OAuth 表单提交、老接口仍会使用它。
4. multipart/form-data
multipart 适合文件上传和混合字段。
Content-Type: multipart/form-data; boundary=----abc
它把 body 分成多个 part,每个 part 可以有自己的头。
例如一个 part 是 userId,另一个 part 是 avatar.png。
它比把文件转 Base64 放进 JSON 更适合大文件。
5. application/octet-stream 和 text/plain
application/octet-stream 表示通用二进制流。
它常用于上传单个文件、下载未知类型文件、对象存储直传。
text/plain 表示纯文本。
它适合日志片段、简单文本回调、调试接口。
但如果业务数据有结构,JSON 通常更清晰。
6. 常见格式对比
| 格式 | 示例 Content-Type | 适合场景 | 主要限制 |
|---|---|---|---|
| JSON | application/json | REST API、结构化数据 | 不适合大二进制 |
| 表单编码 | application/x-www-form-urlencoded | 简单表单 | 嵌套结构弱 |
| multipart | multipart/form-data | 文件上传 | 解析更复杂 |
| 二进制流 | application/octet-stream | 单文件流 | 元信息需另传 |
| 纯文本 | text/plain | 简单文本 | 结构化能力弱 |
选择格式时看数据形态,而不是只看接口习惯。
7. 常见误区与追问
- 误区:POST 请求体默认就是 JSON。 POST 只是方法,请求体格式要看 Content-Type。
- 误区:Content-Type 和 Accept 是一回事。 Content-Type 描述发送的 body,Accept 描述希望接收的响应类型。
- 误区:文件上传用 JSON 最简单。 Base64 会增加体积,也不利于流式处理。
- 追问:服务端为什么返回 415? 通常是请求 Content-Type 不被接口支持。
- 追问:表单编码里的中文怎么传? 字段值会按约定编码后进行百分号编码。
- 追问:octet-stream 怎么带文件名? 可以通过 URL、查询参数、Header 或业务元数据传递。
8. 加强记忆
请求体格式选择可以按 4 个词记:结构用 JSON,简单用表单,文件用 multipart,原始字节用 octet-stream。
面试时一定把 Content-Type 放在第一位。