HTTP的Content-type几种常见类型

一、是什么?

Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request headerresponse header里都存在。

二、几个常用类型:

1、application/x-www-form-urlencoded

1)浏览器的原生form表单
2) 提交的数据按照 key1=val1&key2=val2 的方式进行编码,keyval都进行了URL转码

POST [http://www.example.com](http://www.example.com) HTTP/1.1 
Content-Type: application/x-[www-form-urlencoded](http://www-form-urlencoded);charset=utf-8 
 
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

2、multipart/form-data

常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 formenctype 等于这个值。

<form action="/" method="post" enctype="multipart/form-data">
  <input type="text" name="description" value="some text">
  <input type="file" name="myFile">
  <button type="submit">Submit</button>
</form>

请求头看起来像这样

POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
 
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description"
 
some text
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt"
Content-Type: text/plain
 
(content of the uploaded file foo.txt)
---------------------------974767299852498929531610575--

分析如下:

首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。
然后 Content-Type 里指明了数据是以 multipart/form-data 来编码,本次请求的 boundary 是什么内容。
消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。
如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。

3、application/json

消息主体是序列化后的 JSON 字符串,这个类型越来越多地被大家所使用

POST [http://www.example.com](http://www.example.com) HTTP/1.1 
Content-Type: application/json;charset=utf-8 
 
{"title":"test","sub":[1,2,3]}

这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、FirebugFiddler,都会以树形结构展示 JSON 数据,非常友好。

4、text/xml

是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范

POST [http://www.example.com](http://www.example.com) HTTP/1.1 
Content-Type: text/xml 
<!--?xml version="1.0"?--> 
<methodcall> 
    <methodname>examples.getStateName</methodname> 
    <params> 
        <param> 
            <value><i4>41</i4></value> 
    </params> 
</methodcall>

HTTP请求中,几种常见的Content-Type类型

POST请求的消息主体放在entity body中,服务器根据请求头中的Content-Type字段来获取消息主体的编码方式,进而进行解析数据。

一、application/x-www-form-urlencoded

最常见的POST提交数据的方式,原生Form表单,如果不设置enctype属性,默认为application/x-www-form-urlencoded方式提交数据。
首先,Content-Type都指定为application/x-www-form-urlencoded;其次,提交的表单数据会转换为键值对并按照key1=val&key2=val2的方式进行编码,keyval都进行了URL转码。大部分服务端语言都对这种方式有很好的支持。
另外,如利用AJAX提交数据时,也可使用这种方式。例如jQuery,Content-Type默认值都是"application/x-www-form-urlencoded;charset=utf-8"。

二、multipart/form-data

另一个常见的POST数据提交的方式,Form表单的enctype设置为multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,类似我们上面Content-Type中的例子。
由于这种方式将数据有很多部分,它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型;Content-disposition,用来说明字段的一些信息。每部分都是以-boundary开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以-boundary-标示结束。

三、application/json

Content-Type: application/json作为响应头比较常见。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的JSON字符串,其中一个好处就是JSON格式支持比键值对复杂得多的结构化数据。由于JSON规范的流行,除了低版本IE之外的各大浏览器都原生支持JSON.stringify,服务端语言也都有处理JSON的函数,使用起来没有困难。
Goodle的AngularJS种的Ajax功能,默认就是提交JSON字符串。

四、text/xml

答: XML的作用不言而喻,用于传输和存储数据,它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据,在JSON出现之前是业界一大标准(当然现在也是),相比JSON的优缺点大家有兴趣可以上网search。因此,在POST提交数据时,xml类型也是不可缺少的一种,虽然一般场景上使用JSON可能更轻巧、灵活。

五、binary(application/octet-stream)

答: 在谷歌浏览器的Postman工具中,还可以看到"binary"这一类型,指的就是一些二进制文件类型。如application/pdf,指定了特定二进制文件的MIME类型。就像对于text文件类型若没有特定的子类型(subtype),就使用text/plain。类似的,二进制文件没有特定或已知的subtype,即使用application/octet-stream,这是应用程序文件的默认值,一般很少直接使用。对于application/octet-stream,只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组)。很多web服务器使用默认的application/octet-stream来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。一般来说,设置正确的MIME类型很重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值