实体首部字段Content-Type小结

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 详解

猜你喜欢

转载自blog.csdn.net/u013568373/article/details/93631086