POST 请求内容类型
以下是常见的 POST 请求内容类型(Content-Type)及其使用场景的详细总结:
1. application/x-www-form-urlencoded
- 格式:
key1=value1&key2=value2
(URL 编码) - 特点:
- 默认的表单提交格式
- 数据会被 URL 编码(如空格变
+
,中文变%XX
)
- 示例:
POST /submit HTTP/1.1 Content-Type: application/x-www-form-urlencodedusername=admin&password=123456
- 适用场景:
- HTML 表单提交
- 简单的键值对数据传输
2. multipart/form-data
- 格式:分块传输,每块用边界符分隔(
boundary
) - 特点:
- 支持文件上传
- 数据不编码,直接传输原始二进制
- 示例:
POST /upload HTTP/1.1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123----WebKitFormBoundaryABC123 Content-Disposition: form-data; name="username"admin ----WebKitFormBoundaryABC123 Content-Disposition: form-data; name="file"; filename="test.jpg" Content-Type: image/jpeg[二进制文件数据] ----WebKitFormBoundaryABC123--
- 适用场景:
- 文件上传
- 混合文本和二进制数据提交
3. application/json
- 格式:JSON 结构化数据
- 特点:
- 支持复杂嵌套数据结构
- 现代 API 的主流格式
- 示例:
POST /api/users HTTP/1.1 Content-Type: application/json{"name": "张三","age": 25,"address": {"city": "北京"} }
- 适用场景:
- RESTful API 通信
- 需要传递结构化数据的场景
4. text/plain
- 格式:纯文本
- 特点:
- 不进行任何编码
- 极少用于生产环境
- 示例:
POST /log HTTP/1.1 Content-Type: text/plainThis is a plain text message.
- 适用场景:
- 调试或日志记录
- 极简文本传输
5. application/xml
- 格式:XML 结构化数据
- 特点:
- 可读性强但冗余
- 逐渐被 JSON 替代
- 示例:
POST /api HTTP/1.1 Content-Type: application/xml<user><name>张三</name><age>25</age> </user>
- 适用场景:
- 传统企业系统对接(如 SOAP)
- 需要 XML 格式的遗留系统
6. application/octet-stream
- 格式:原始二进制流
- 特点:
- 不指定具体数据类型
- 服务器需自行解析
- 示例:
POST /upload-binary HTTP/1.1 Content-Type: application/octet-stream[原始二进制数据]
- 适用场景:
- 通用二进制文件传输
- 自定义协议数据交换
7. 其他特殊类型
Content-Type | 用途 |
---|---|
application/graphql | GraphQL 查询 |
application/soap+xml | SOAP Web 服务调用 |
application/javascript | 传输 JS 代码(罕见) |
如何选择?
- 简单表单 →
x-www-form-urlencoded
- 文件上传 →
multipart/form-data
- API 交互 →
application/json
- 二进制数据 →
octet-stream
- 传统系统 →
application/xml
各语言示例代码
Python (Requests)
# JSON
requests.post(url, json={"key": "value"})# Form-data
requests.post(url, data={"key": "value"})# File upload
requests.post(url, files={"file": open("test.jpg", "rb")})
JavaScript (Fetch)
// JSON
fetch(url, {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ key: 'value' })
});// Form-data
const formData = new FormData();
formData.append('file', fileInput.files[0]);
fetch(url, { method: 'POST', body: formData });
Java (Spring Boot)
// JSON
@PostMapping("/api")
public ResponseEntity<?> handleJson(@RequestBody UserDTO user) {// ...
}// Multipart
@PostMapping("/upload")
public String uploadFile(@RequestParam MultipartFile file) {// ...
}
关键注意事项
- 安全:敏感数据避免用
x-www-form-urlencoded
的 GET 请求 - 性能:大文件用
multipart/form-data
,小数据用 JSON - 兼容性:传统系统可能仅支持 XML 或 form-data
- Content-Type 必须正确设置,否则服务器无法解析数据