Content-Type 简介
Content-Type 又称 MIME 类型,在互联网中有成百上千中不同的数据类型,HTTP 在传输数据对象时会为他们打上称为 MIME 的数据格式标签,用于区分数据类型。最初 MIME 是用于电子邮件系统的,后来 HTTP 也采用了这一方案。
我们用 Chrome 的开发者模式以访问百度为例,简单看看 Response 的几种 Content-Type 类型。
如下所示
html 文档
样式文件,CSS
图像文件,png格式
Content-Type 格式
Content-Type:type/subtype ;parameter
参数解释:
- type:主类型,任意的字符串,如 text,如果是 * 号代表所有。
- subtype :子类型,任意的字符串,如 html,如果是 * 号代表所有,用 “ / ” 与主类型隔开。
- parameter:可选参数,如 charset,boundary 等。
两个例子:
- Content-Type : text/html
- Content-Type : application/json;charset:utf-8
几个常见的 Content-Type 值
1. 以 application 开头的这两种媒体格式类型:
- application/json:参数主体是序列化后的 JSON 字符串,会被直接放到请求实体里,不进行任何处理。
- application/x-www-form-urlencoded:http 会将请求参数用 key1=val1&key2=val2 的方式进行组织,并放到请求实体里面,这是标准的编码格式。当表单的 action 为 get 时候,客户端把 form 数据转换成一个字串 append 到 url 后面,用 ‘?’ 分割。当 action 为 post 时候,浏览器把 form 数据封装到 http body 中,然后发送到 server.
2. 上传文件时常用的 multipart/form-data:
multipart/form-data 支持文件上传的格式,一般需要上传文件的表单使用该类型。
3. 以 xml 格式编码数据体,早期广泛使用的格式 text/xml:
与 application/json 类似,这里用的是 xml 格式的数据,text/xml 的话,将忽略 xml 数据里的编码格式。
完整的 Content-Type 取值对照表链接: HTTP Content-type 常用对照表
关于 Request 和 Response 的 Content-Type
1. 请求 Request 的 Content-Type:
前端开发需要注意请求时的 Content-Type 设置,特别是使用 ajax 的时候,如果设置得不准确,很有可能导致请求失败。比如在 Spring 中,如果接口使用了 @RequestBody,Spring 强大的自动解析功能,会将请求实体的内容自动转换为 Bean,但前提是请求的 Content-Type 必须设置为 application/json,否正就会返回 415 错误(415 错误是 Unsupported media type,即不支持的媒体类型)。
2. 响应 Response 的 Content-Type:
服务端响应(Response)的 Content-Type 最好也保持准确,虽然一般 Web 开发中,前端解析响应的数据不会根据 Content-Type,并且服务端一般能自动设置准确的 Content-Type。
但是有一种特殊情况,这种情况其实也比较常见,那就是导出、下载文件。此时我们需要手动设置 Content-Type 的值。
比如下面这个导出 excel 文件的代码(Content-Disposition 是 Content-Type 的扩展,告诉浏览器弹窗下载框,而不是直接在浏览器里展示文件。因为一般浏览器对于它能够处理的文件类型,如 txt,pdf 等,它都是直接打开展示,而不是弹窗下载框)。
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
response.flushBuffer();
workbook.write(response.getOutputStream());
所以,一般情况下,虽然后端码农不需要显式的设置 Content-Type 的值,但遇到例如导出文件这种特殊情况还是需要注意下。
参考链接: Content-Type 详解