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 |
|
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 中 还是非常重要的. 否则浏览器可能会不知道 该怎么解释请求的内容....