content-type的那些事儿
1. 什么是content-type
Content-Type是返回消息中非常重要的内容,表示后面的文档属于什么MIME类型。Content-Type: [type]/[subtype]; parameter。例如最常见的就是text/html,它的意思是说返回的内容是文本类型,这个文本又是HTML格式的。原则上浏览器会根据Content-Type来决定如何显示返回的消息体内容。
一般是指网页中存在的Content-Type,Content-Type属性指定请求和响应的HTTP内容类型。如果未指定 ContentType,默认为text/html。
2. Content-type与Accept
-
(1)Accept属于请求头, Content-Type属于实体头。
请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报头结构:通用报头|响应报头|实体报头
-
(2)Accept代表发送端(客户端)希望接受的数据类型, Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
3. content-type种类
常见的格式
1.text/html (html格式)
2.text/plain (纯文本格式)
3.text/css (css格式)
4.text/javascript (javascript格式)
5.image/gif (gif图片格式)
以application开头的媒体格式类型:
6.application/x-www-form-urlencoded (
<form encType=””>
中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式))
7.application/json(JSON数据格式)
8.application/xml(xml数据格式)
另外一种常见的媒体格式是上传文件之时使用的:
9.multipart/form-data (需要在表单中进行文件上传时,就需要使用该格式)
4. 常用的content-type种类分析
1. application/x-www-form-urlencoded
application/x-www-form-urlencoded
是常用的表单发包方式,普通的表单提交,或者js发包,默认都是通过这种方式。
这应该是最常见的 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 转码。大部分服务端语言都对这种方式有很好的支持。
很多时候,我们用 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– 标示结束。
3. application/json
通过json形式将数据发送给服务器,由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦, 而且JSON 格式支持比键值对复杂得多的结构化数据。