HTTP Content-Type
Content-Type
关于Content-Type
即MediaType
,即是Internet Media Type
,互联网媒体类型;也叫做MIME类型
,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
Content-Type是实体头域(或称为实体头部,entity header)用于向接收方指示实体(entity body)的介质类型的,或称为资源的MIME类型,现在通常称media type更为合适。(例如,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型,表示后面的文档属于什么MIME类型。)
POST请求的消息主体放在entity body中,服务端根据请求头中的Content-Type字段来获取消息主体的编码方式,进而进行解析数据。
Content-Type的格式:
Content-Type:type/subtype ;parameter
1 | type :主类型,任意的字符串,如text,如果是*号代表所有; |
例如:
1 | Content-Type: text/html; |
常见的媒体格式类型如下:
1 | text/html :HTML格式 |
以application开头的媒体格式类型:
1 | application/xhtml+xml :XHTML格式 |
另外一种常见的媒体格式是上传文件之时使用的:
1 | multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式 |
以上就是我们在日常的开发中,经常会用到的若干content-type的内容格式。
HTTP请求中,几种常见的Content-Type类型
一、application/x-www-form-urlencoded
最常见的POST
提交数据的方式,原生Form
表单,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded
方式提交数据。
HTTP会将请求参数用key1=val1&key2=val2
的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/"、","、":"
等会自动进行URL转码。不支持文件,一般用于表单提交。
二、multipart/form-data
与application/x-www-form-urlencoded
不同,这是一个多部分多媒体类型。首先生成了一个boundary
用于分割不同的字段,在请求实体里(Content-disposition
)每个参数以------boundary开始
,然后是附加信息和参数名,然后是空行,最后是参数内容。
多个参数将会有多个boundary块
。如果参数是文件会有特别的文件域。最后以------boundary–-
为结束标识。multipart/form-data
支持文件上传的格式,一般需要上传文件的表单则用该类型。
boundary的作用:
当content-type
为multipart/form-data
类型时,需要用boundary
指定分隔符。所以boundary后面跟的随机数,就是分隔符,后端就是通过解析到boundary的值作为分隔符来分隔参数的。
一般来说都不需要手动添加boundary值,浏览器、python的request库都会自动设定boundary的值
三、application/json
Content-Type: application/json
作为响应头比较常见。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的JSON字符串,其中一个好处就是JSON 格式支持比键值对复杂得多的结构化数据。
JSON 是一种轻量级的数据格式,以“键-值”对
的方式组织的数据。这个使用这个类型,需要参数本身就是json格式的数据,参数会被直接放到请求实体里,不进行任何处理。服务端/客户端会按json格式解析数据(约定好的情况下)。
Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。
四、application/xml 和 text/xml
与application/json
类似,这里用的是xml格式的数据,text/xml的话,将忽略xml数据里的编码格式
五、binary (application/octet-stream)
在Chrome浏览器的Postman工具中,还可以看到binary
这一类型,指的就是一些二进制文件类型。
如application/pdf
,指定了特定二进制文件的MIME类型。就像对于text文件类型若没有特定的子类型(subtype),就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,即使用 application/octet-stream,这是应用程序文件的默认值,一般很少直接使用 。
对于application/octet-stream,只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组)。
很多web服务器使用默认的 application/octet-stream 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。一般来说,设置正确的MIME类型很重要。
request 的Content-Type 建议:
- 如果是一个restful接口(json格式),一般将
Content-Type
设置为application/json; charset=UTF-8
- 如果是文件上传,一般
Content-Type
设置为multipart/form-data
- 如果是普通表单提交,一般
Content-Type
设置为application/x-www-form-urlencoded