Content‑Type 是 HTTP 请求/响应头,用来告诉接收方:请求/响应体的数据是什么MIME类型,浏览器/服务器据此解析body内容。
格式:Content-Type: ; charset=<编码>
- mime‑type:主类型/子类型
- charset:文本编码,常用 utf‑8;二进制文件不要加charset
一、文本类 text/*
| Content-Type | 说明 | 使用场景 |
|---|---|---|
| text/plain | 纯文本,无格式 | 返回普通文本、日志、简单字符串 |
| text/html | HTML网页 | 返回html页面,浏览器渲染网页 |
| text/css | CSS样式表 | 返回css文件 |
| text/javascript | JS脚本(旧标准) | js文件,现在推荐application/javascript |
| text/xml | XML文本 | xml格式数据,老式接口 |
示例
Content-Type: text/html;charset=utf-8
二、JSON / XML 结构化数据 application/*(接口最常用)
| Content-Type | 说明 | 场景 |
|---|---|---|
| application/json | JSON格式 | 前后端JSON接口99%使用 |
| application/xml | xml数据 | soap接口、老系统xml接口 |
| application/x-www-form-urlencoded | 表单url编码 | form表单默认,key=value&a=1,普通post表单 |
| application/json;charset=utf-8 | json带编码 | 防止中文乱码 |
⚠️application/x‑www‑form‑urlencoded: 数据格式:name=zhangsan&age=20,只能传简单键值,不能传文件。
三、文件上传 multipart/*
专门用于表单上传文件,不能用application/x‑www‑form‑urlencoded
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxx
- boundary:分隔符,分割表单多个字段(普通字段+文件字节流),浏览器自动生成,不要手动写。
- 场景:form表单设置 enctype="multipart/form-data",上传图片、文件。
四、二进制文件、媒体资源
| Content‑Type | 用途 |
|---|---|
| application/octet‑stream | 通用二进制流,下载文件,浏览器直接弹出下载框 |
| image/jpeg | jpg图片 |
| image/png | png图片 |
| image/gif | gif动图 |
| image/webp | webp图片 |
| audio/mpeg | mp3音频 |
| video/mp4 | mp4视频 |
| application/pdf | pdf文档 |
| application/zip | zip压缩包 |
application/octet‑stream示例:
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="demo.xlsx"
Content‑Disposition 配合它实现下载文件。
五、容易混淆的3种POST请求类型(高频面试)
1. application/x‑www‑form‑urlencoded
- 普通表单post,无文件;body:username=aaa&password=123
- axios默认post就是这个。
2. application/json
- body直接放json字符串:{"username":"aaa"}
- 现在主流REST接口。
3. multipart/form‑data
- 文件上传,同时可以带普通参数,必须带boundary。
❌错误:上传文件设置application/json,会直接报错,文件二进制无法json序列化。
六、其他少见MIME
- application/javascript:标准js MIME,替代废弃text/javascript
- application/vnd.ms‑excel:旧版excel
- application/vnd.openxmlformats‑officedocument.spreadsheetml.sheet:xlsx新版excel
七、常见踩坑点
- charset只给文本类型用:图片、二进制流不要写charset=utf‑8,会导致解析异常。
- 后端返回json中文乱码:设置 Content-Type:application/json;charset=utf‑8
- 不要手动写boundary,multipart/form-data由http客户端自动生成。
- application/octet‑stream只是二进制标记,不能识别文件类型,只是强制下载。
- 请求头Content-Type告诉服务器请求体格式;响应头告诉浏览器响应体格式,两者独立。
八、完整示例
1)json请求
POST /api/login HTTP/1.1
Content-Type: application/json;charset=utf-8
{"username":"test","pwd":"123456"}
2)表单url编码
POST /api/login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=test&pwd=123456
3)文件下载响应
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Disposition: attachment;filename="test.zip"