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
2
3
type     :主类型,任意的字符串,如text,如果是*号代表所有;
subtype :子类型,任意的字符串,如html,如果是*号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。

例如:

1
2
Content-Type: text/html;
Content-Type: application/json;charset:utf-8;

常见的媒体格式类型如下:

1
2
3
4
5
6
text/html  :HTML格式
text/plain :纯文本格式
text/xml :XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png :png图片格式

以application开头的媒体格式类型:

1
2
3
4
5
6
7
8
application/xhtml+xml  :XHTML格式
application/xml :XML数据格式
application/atom+xml :Atom XML聚合格式
application/json :JSON数据格式
application/pdf :pdf格式
application/msword :Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : <form encType="">中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

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-typemultipart/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