← 返回题目列表

HTTP 请求体常见格式有哪些?表单、JSON、二进制流分别适合什么场景?

中等 第 24 / 32 题 更新于 2026/08/02
HTTPContent-Type请求体

简化版

HTTP 请求体格式由 Content-Type 描述。

常见格式包括 application/jsonapplication/x-www-form-urlencodedmultipart/form-datatext/plainapplication/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适合场景主要限制
JSONapplication/jsonREST API、结构化数据不适合大二进制
表单编码application/x-www-form-urlencoded简单表单嵌套结构弱
multipartmultipart/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 放在第一位。