Content-Type 与 MediaType 存在对应关系:
Content-Type
- 客户端发起 HTTP POST/PUT 请求时,可以指定Request Header 的 Content-Type,表示向服务端发送的 Request Body 中的数据的格式
- 服务端返回数据时,也可以指定Content-Type,表示返回数据的格式
MediaType
服务端接口中设置,表示只接收客户端发送的指定类型的数据,否则报错
在Spring MVC 中,可以通过如下来指定 MediaType,表示该接口只接收 Content-Type 为 JSON 的数据。
@RequestMapping(value = "{bookId}", method = RequestMethod.POST, consume = MediaType.APPLICATION_JSON_VALUE)
常见的Content-Type/MediaType
- application/atom+xml
- application/x-www-form-urlencoded
- application/json
- application/octet-stream
- application/xhtml+xml
- application/xml
- image/gif
- image/jpeg
- image/png
- multipart/form-data
- text/html
- text/plain
- text/xml
application/x-www-form-urlencoded
query string -- name/value pairs are separated by the ampersand (&), and names are separated from values by the equals symbol (=)
var1=One&var2=Two
multipart/form-data
上传文件时,使用该类型,举个例子:
// request line
POST http://www.example.com HTTP/1.1
// request header
Content-Type:multipart/form-data; boundary=WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Length: $requestlen
// request body
--Boundary-----------------------
content-disposition: form-data; name="field1"
value1
--Boundary-----------------------
content-disposition: form-data; name="field2"
value2
--Boundary-----------------------
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
Content-Transfer-Encoding: binary
$binarydata
--Boundary-----------------------
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain
Content of a.txt.
--Boundary-----------------------
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html
<!DOCTYPE html><title>Content of a.html.</title>
--Boundary-----------------------
Content-Disposition: form-data; name="file3"; filename="binary"
Content-Type: application/octet-streamaωb
$binarydata
--Boundary--
- 首先生成了一个 boundary 用于分割不同的字段(该字段可设置的复杂点,以防与正文重复)
- 消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary开始;每一部份有自己的 MIME headers,如Content-Type、Content-Disposition
- 消息主体最后以 --boundary-- 标示结束
application/json
告诉服务端消息主体是序列化后的 JSON 字符串。JSON 格式支持比键值对复杂得多的结构化数据,特别适合 RESTful 的接口。
text/xml
XML-RPC(XML Remote Procedure Call),是一种使用 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 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。