浅析HTTP请求中常见的Content-Type

在我们进行前端开发的时候,经常需要折腾form表单或ajax请求数据类型,以便让后端可以顺利解析我们的请求数据。
常见Content-Type的包括multipart/form-dataapplication/x-www-form-urlencodedapplication/json3种类型。

Content-type

HTTP协议把请求信息分为三个部分: 请求行、请求头和请求体。
请求行:由请求方法、请求地址、HTTP协议版本三个字段组成
请求头:由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息。
请求体: 我们常用的post请求数据就存放在此。

Content-Type包含在请求头中,用于指定请求和响应的HTTP内容类型,告诉浏览器将以什么形式、什么编码读取这个文件。
Content-Type的格式: [type]/[subtype] / parameter
例如最常见的就是text/html,它的意思是说返回的内容是文本类型,这个文本又是HTML格式的。

type常见的形式:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;

parameter可以用来指定附加的信息,更多情况下是用于指定text/plaintext/htm等的文字编码方式的charset参数。

application/x-www-form-urlencoded

说明:数据会被被编码为名称/值对。这是标准的编码格式。
浏览器会用x-www-form-urlencoded的编码方式把数据转换成一个字串(name1=value1&name2=value2...

multipart/form-data

它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。
既可以上传键值对,也可以上传文件。
当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息。

形如:

1
2
3
4
5
6
7
8
9
10
11
12
13
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--

application/json

用来告诉服务端消息主体是序列化后的 JSON 字符串。