一 媒介
—-如今搞前端的不学好http有关的学问已不行啦~笔者也是后知后觉,在搞node的时刻意想到收集方面的柔弱,最先学起http相干学问。这一篇是异常基本的解说,合适入门职员控制content-type的学问和有履历的职员查阅。能够说,弄懂了content-type,你才在进修http的道路上走的越发顺畅,让我们满怀激情的最先吧~~
二 正文
1.熟悉content-type
要进修content-type,必需事前晓得它究竟是什么,是干什么用的。
HTTP协定(RFC2616)采用了要求/响应模子。客户端向效劳器发送一个要求,要求头包含要求的要领、URI、协定版本、以及包含要求修饰符、客户信息和内容的相似于MIME的音讯构造。效劳器以一个状况行作为响应,响应的内容包含音讯协定的版本,胜利或许毛病编码加上包含效劳器信息、实体元信息以 及能够的实体内容。
平常HTTP音讯由一个起始行,一个或许多个头域,一个只是头域完毕的空行和可选的音讯体构成。
HTTP的头域包含通用头,要求头,响应头和实体头四个部份。每个头域由一个域名,冒号(:)和域值三部份构成。域名是大小写无关的,域值前能够增加任何数目的空格符,头域能够被扩大为多行,在每行最先处,运用最少一个空格或制表符。
要求音讯和响应音讯都能够包含实体信息,实体信息平常由实体头域和实体构成。实体头域包含关于实体的原信息,实体头包含Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。
Content-Type是返回音讯中异常重要的内容,示意背面的文档属于什么MIME范例。Content-Type: [type]/[subtype]; parameter。比方最罕见的就是text/html,它的意义是说返回的内容是文本范例,这个文本又是HTML花样的。原则上浏览器会依据Content-Type来决议怎样显现返回的音讯体内容。
2.Content-type与Accept
(1)Accept属于要求头, Content-Type属于实体头。
Http报头分为通用报头,要求报头,响应报头和实体报头。
要求方的http报头构造:通用报头|要求报头|实体报头
响应方的http报头构造:通用报头|响应报头|实体报头
(2)Accept代表发送端(客户端)愿望接收的数据范例。
比方:Accept:text/xml;
代表客户端愿望接收的数据范例是xml范例
Content-Type代表发送端(客户端|效劳器)发送的实体数据的数据范例。
比方:Content-Type:text/html;
代表发送端发送的数据花样是html。
两者合起来,
Accept:text/xml;
Content-Type:text/html
即代表愿望接收的数据范例是xml花样,本次要求发送的数据的数据花样是html。
3.content-type速查
更全面的请接见:http://www.runoob.com/http/ht…
罕见的媒体花样范比方下:
text/html : HTML花样
text/plain :纯文本花样
text/xml : XML花样
image/gif :gif图片花样
image/jpeg :jpg图片花样
image/png:png图片花样
以application开首的媒体花样范例:
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花样发送到效劳器(表单默许的提交数据的花样)
别的一种罕见的媒体花样是上传文件之时运用的:
multipart/form-data : 须要在表单中举行文件上传时,就须要运用该花样
4.罕见的content-type解说
(1)application/x-www-form-urlencoded
这应该是最罕见的 POST 提交数据的体式格局了。浏览器的原生 form 表单,假如不设置 enctype 属性,那末终究就会以 application/x-www-form-urlencoded 体式格局提交数据。要求相似于下面如许(无关的要求头在本文中都省略掉了):
POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
起首,Content-Type 被指定为 application/x-www-form-urlencoded;
其次,提交的数据根据 key1=val1&key2=val2 的体式格局举行编码,key 和 val 都举行了 URL 转码。大部份效劳端言语都对这类体式格局有很好的支撑。比方 PHP 中,$_POST[‘title’] 能够获取到 title 的值,$_POST[‘sub’] 能够取得 sub 数组。
许多时刻,我们用 Ajax 提交数据时,也是运用这类体式格局。比方 JQuery 和 QWrap 的 Ajax,Content-Type 默许值都是「application/x-www-form-urlencoded;charset=utf-8」。
(2)multipart/form-data
这又是一个罕见的 POST 数据提交的体式格局。我们运用表单上传文件时,必需让 form 的 enctyped 即是这个值。
客户端form标签:
<form action="url" enctype="multipart/form-data" method="post"></form>
直接来看一个天生的要求示例:
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
起首天生了一个 boundary 用于支解差别的字段,为了避免与正文内容反复,boundary 很长很庞杂。
然后 Content-Type 里指清楚明了数据是以 mutipart/form-data 来编码,本次要求的 boundary 是什么内容。音讯主体里根据字段个数又分为多个构造相似的部份,每部份都是以 –boundary 最先,紧接着内容形貌信息,然后是回车,末了是字段具体内容(文本或二进制)。假如传输的是文件,还要包含文件名和文件范例信息。音讯主体末了以 –boundary– 标示完毕。关于 mutipart/form-data 的细致定义,请前去 rfc1867 检察。
这类体式格局平常用来上传文件,各大效劳端言语对它也有着优越的支撑。
上面提到的这两种 POST 数据的体式格局,都是浏览器原生支撑的,而且现阶段原生 form 表单也只支撑这两种体式格局。然则跟着越来越多的 Web 站点,尤其是 WebApp,悉数运用 Ajax 举行数据交互以后,我们完全能够定义新的数据提交体式格局,给开辟带来更多轻易。
(3)application/json
application/json 这个 Content-Type 作为响应头人人一定不生疏。实际上,如今越来越多的人把它作为要求头,用来通知效劳端音讯主体是序列化后的 JSON 字符串。因为 JSON 范例的盛行,除了低版本 IE 以外的各大浏览器都原生支撑 JSON.stringify,效劳端言语也都有处置惩罚 JSON 的函数,运用 JSON 不会赶上什么贫苦。
JSON 花样支撑比键值对庞杂很多的构造化数据,这一点也很有效。记得我几年前做一个项目时,须要提交的数据条理异常深,我就是把数据 JSON 序列化以厥后提交的。不过当时我是把 JSON 字符串作为 val,依然放在键值对里,以 x-www-form-urlencoded 体式格局提交。
Google 的 AngularJS 中的 Ajax 功用,默许就是提交 JSON 字符串。比方下面这段代码:
var data = {'title':'test', 'sub' : [1,2,3]};
$http.post(url, data).success(function(result) {
...
});
终究发送的要求是:
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
这类计划,能够轻易的提交庞杂的构造化数据,迥殊合适 RESTful 的接口。各大抓包东西如 Chrome 自带的开辟者东西、Firebug、Fiddler,都邑以树形构造展现 JSON 数据,异常友爱。但也有些效劳端言语还没有支撑这类体式格局,比方 php 就没法经由过程 $_POST 对象从上面的要求中取得内容。这时刻,须要本身着手处置惩罚下:在要求头中 Content-Type 为 application/json 时,从 php://input 里取得原始输入流,再 json_decode 成对象。一些 php 框架已最先这么做了。
(4)text/xml
它是一种运用 HTTP 作为传输协定,XML 作为编码体式格局的长途挪用范例。典范的 XML-RPC 要求是如许的:
POST 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>
</param>
</params>
</methodCall>
XML-RPC 协定简朴、功用够用,种种言语的完成都有。它的运用也很普遍,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 效劳等等。JavaScript 中,也有现成的库支撑以这类体式格局举行数据交互,能很好的支撑已有的 XML-RPC 效劳。不过,我个人以为 XML 构造照样过于痴肥,平常场景用 JSON 会更天真轻易。
三 跋文
RFC2616:https://www.w3.org/Protocols/…
内容参考:
(1)http://blog.csdn.net/bluehear…
(2)https://www.topjishu.com/6324…
(3)http://blog.csdn.net/muzizong…