作为前端开发,工作中少不了与接口请求打交道。对于常见的content-type,也能说上来几个,感觉还算了解。直到有一天,我要在查看google的批量接口合并时发现Content-Type: multipart/mixed以及Content-Type: application/http时,有点措手不及。赶紧深入研究下Content-Type相关内容来弥补下自己的不足,从前端的角度来看看Content-Type。
Content-TypeContent-Type:实体头部用于指示资源的MIME类型。如果未指定 ContentType,默认为text/html
有两种场景:
在请求中 (如POST 或 PUT),客户端告诉服务器实际发送的数据类型。
在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。浏览器会在某些情况下进行MIME查找,并不一定遵循此标题的值; 为了防止这种行为,可以将标题 X-Content-Type-Options 设置为 nosniff。
简而言之就是标识资源或者所需资源的MIME类型。
句法如下:
Content-Type: text/html; charset=utf-8 Content-Type: multipart/form-data; boundary=something参数一般media-type、charset、boundary三种。
我们的关注点在于media-type的取值以及其适用场景。
更多的是作为MIME type( Multipurpose Internet Mail Extensions)出现,即多用途Internet邮件扩展。
其目的是用一种标准化的方式来标识文档的性质和格式。
浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;
因此服务器设置正确以将正确的MIME类型附加到响应对象的头部是非常重要的。
MIME 组成结构如下:
由类型与子类型两个字符串中间用\'/\'分隔而组成。不允许空格存在。对大小写不敏感,但传统都是小写。
允许额外参数,如后面所示:
其中:
type对应通用类目,例如:text/video等。
subtype对应准确的子类,例如text下面细分为plain(纯文本)、html(html源码)、calendar(.ics)文件等。
parameter可选一般是charset或者bundaary等。
Types类目包括两种类型:独立类型和Multipart类型。
独立类型独立类型指只代表一个单独的文件或者媒体的类型,表明了对文件的分类。
常见类型和实例如下:
text
文本数据包括一些人类可读的内容或者源码。例如:text/plain, text/csv, text/html.
application
数据为二进制的一种,例如application/octet-stream,application/pdf,application/pkcs8,application/zip.
audio
音频或者音乐数据,例如audio/mpeg, audio/vorbis
video
视频数据或者文件,例如video/mp4
image
图像或图形数据,包括位图和矢量静止图像以及静止图像格式的动画版本。例如image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon
Multipart类型指明被分为几部分的一种文档的类目,且经常有不同的MIME类型。也可以用来表示属于相同事物的多个且独立的文件,这些独立的文件构成一个复杂的文档。在电子邮件场景中常见。
有两种Multipart类型:message和multipart。
message
一个包括其他信息的消息,常用于下面的场景,例如指明一个邮件包含转发信息或者在多种信息的情况下,允许以chunk的形式发送数据量很大的信息。包括message/rfc822和message/partial
multipart
由多个不同MIME类型组件构成的数据,例如 multipart/form-data(使用FormData API生成的数据)
看完了基本定义,下面看看常见的类型及使用场景。
常见类型及使用场景 静态资源、图片、媒体类对于静态资源、图片和媒体类,也就是text、image、video等比较清晰明了,不再详细描述。
application类
application/json
随着json这种轻量级的数据交互格式的流行,特别是和脚本交互的便利,使得在前后接口中,越来越多采用json格式。对于http协议来说,最终传输的还是字符。这里不再多进行描述。
application/x-www-form-urlencoded
作为表单提交中默认的类型,其表明数据以标准的编码格式被编码为键值对。
数据被编码成以 \'&\' 分隔的键-值对, 同时以 \'=\' 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替).
我们以新浪为例,可以看到其请求报文(formdata那里选择,view source可以看得比较清楚):
multipart/form-data
这里为了对比,就也放到这里来说了。
一般用于涉及文件的表单提交,用于post请求,其格式如下: