Content-Type是什么?
在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。
Post请求的内容放置在请求体中,Content-Type定义了请求体的编码格式。数据发送出去后,还需要接收端解析才可以。接收端依靠请求头中的Content-Type字段来获知请求体的编码格式,最后再进行解析。
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: application/x-www-form-urlencoded;charset:utf-8;
常见Content-Type
常见的Content-Type有数百个,下面例举了一些
- HTML文档标记:text/html;
- 普通ASCII文档标记:text/html;
- JPEG图片标记:image/jpeg;
- GIF图片标记:image/gif;
- js文档标记:application/javascript;
- xml文件标记:application/xml;
Post请求中常见的Content-Type类型的结构
(1) application/x-www-form-urlencoded
这是浏览器原生的form表单类型,或者说是表单默认的类型。post将请求参数以key1=value1&key2=value2这种键值对的方式进行组织,并放入到请求体中。其中中文或某些特殊字符,如”/“、”,”、“:” 等会自动进行URL转码。
(2) application/json
现在绝大部分的请求都会以json形式进行传输,post会将序列化后的json字符串直接塞进请求体中。请求体中就是Json字符串。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。
(3) multipart/form-data
用于在表单中上传文件
Content-Type的使用
request 的Content-Type
一般我们在开发的过程中需要注意客户端发送请求(Request)时的Content-Type设置,特别是使用ajax的时候,如果设置得不准确,很有可能导致请求失败。比如在spring中,如果接口使用了@RequestBody,spring强大的自动解析功能,会将请求实体的内容自动转换为Bean,但前提是请求的Content-Type必须设置为application/json,否正就会返回415错误。
⚠️注:415 错误是 Unsupported media type,即不支持的媒体类型。
建议:
如果是一个restful接口(json格式),一般将Content-Type设置为application/json; charset=UTF-8;
如果是文件上传,一般Content-Type设置为multipart/form-data
如果普通表单提交,一般Content-Type设置为application/x-www-form-urlencoded
response的Content-Type
服务端响应(Response)的Content-Type最好也保持准确,虽然一般web开发中,前端解析响应的数据不会根据Content-Type,并且服务端一般能自动设置准确的Content-Type,但是如果乱设置某些情况下可能会有问题,比如导出文件,打开图片等。如果在spring项目里使用@ResponseBody,spring会将响应的Content-Type设置为application/json;charset=UTF-8;,可能会导致文件无法导出,需要注意下。
response的Content-Type设置建议:
一般情况下不需要显示设置;
如果是文件导出,Content-Type 设置为 multipart/form-data,并且添加一个Content-Disposition设置为attachment;fileName=文件.后缀。
⚠️注:Content-Disposition是Content-Type的扩展,告诉浏览器弹窗下载框,而不是直接在浏览器里展示文件。因为一般浏览器对于它能够处理的文件类型,如txt,pdf 等,它都是直接打开展示,而不是弹窗下载框。