几种 Content-Type 的区别

Content-Type 是在 HTTP头中一个非常重要的头标示, 他就像一个说明书,说明了服务端/或浏览器应该怎么处理这次请求.

其实不管是 request 还是 response 都应该有 Content-Type 但是这个要求只有在 POST 下是必须的.(因为get请求有可能 content-body 部分是空的, 所以指定 Content-Type 无意义,干脆省略)

我们先说 Request

在一次HTTP请求(request)中可以带参数的地方总共有3个:

部分 用途
URL 部分 就是以 ? &分割的 url参数
header 部分 在http头中的字段 常用的比如说cookie
content-body 部分 请求正文,如果是 get 请求则是空的

如果是post请求,则请求头中的 Content-Type 字段规定了content-body部分应该怎么被解析:

Content-Type 用途
application/x-www-form-urlencoded
默认的方式, 比如 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
multipart/form-data 如果你的请求里包含多个文件等二进制信息,则form 的 enctyped 需要等于这个值,浏览器生成一个 boundary 用于分割不同的字段
application/json json格式
raw 纯二进制格式,这需要服务器拿到消息后自己定义解析方式.

multipart/form-data 详细说明:

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其实就是分割线,下文将看到,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

再说 Response:

HTTP 中 Response 的 Content-Type 标明了 客户端(往往是指浏览器)该如何解析这次请求, 一般 webserver 会根据请求文件的扩展名自动填上匹配的 Content-Type 值 但这个值 只是一个指导作用, 意思就是说如果你给一个 <img> 的 src 指向一个 Content-Type= text/css 的错误值, 会发现图片一样可以正确的被显示,(只要图片正文对就行)

现在浏览器可以解释的文件类型很多,除了常用的 HTML , 还有 pdf , word , 多媒体数据 等等.所以Content-Type 在 response 中 还是非常重要的. 否则浏览器可能会不知道 该怎么解释请求的内容....

留言:

称呼:*

邮件:

网站:

内容: