HTTP协议中Content-Type

  • 关于content_type
    • content_type语法
  • GET常见数据的提交类型
  • POST常见数据的提交类型
    • application/x-www-form-urlencoded
    • multipart/form-data
    • application/json
    • binary (application/octet-stream)

关于content_type

Content-Type是实体头域(或称为实体头部,entity header)用于向接收方指示实体(entity body)的介质类型的,或称为资源的MIME类型,现在通常称media type更为合适。
在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。在请求中 (如POST 或 GET),客户端告诉服务器实际发送的数据类型。

content_type语法

Content-Type: text/html; charset=utf-8 
Content-Type: multipart/form-data; boundary=something[1 to 70 characters]

media-type 资源或数据的 media type
charset 字符编码标准
boundary 对于多部分(multipart)实体,boundary 是必需的,它用于封装消息的多个部分的边界。其由1到70个字符组成,浏览器自动生成,该字符集对于通过网关鲁棒性良好,不以空白结尾。下面我们举一个Content-Type 在HTML表单中的例子:

"/" method="post" enctype="multipart/form-data"> type="text" name="description" value="some text"> type="file" name="myFile">

真实的请求头看起来像这样:

POST /foo HTTP/1.1
Content-Length: 68137
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575

---------------------------974767299852498929531610575
Content-Disposition: form-data; name="description" 

some text
---------------------------974767299852498929531610575
Content-Disposition: form-data; name="myFile"; filename="foo.txt" 
Content-Type: text/plain 

(content of the uploaded file foo.txt)
---------------------------974767299852498929531610575 #最后一行是结尾boundary

GET常见数据的提交类型

GET方式,是把参数按键值对通过QueryString的方式放在URL尾部,比如: http://www.example.com/test.html?a=1&b=2 ,默认的Content-Type为“application/x-www-form-urlencoded”。

POST常见数据的提交类型

POST方法,通常是把要提交的表单放在一个Form中,指明action后就可以提交数据 。提交数据时需要通过表单enctype属性(规定在发送到服务器之前应该如何对表单数据进行编码)来确定编码类型, 其默认的方式也为”application/x-www-form-urlencoded”。

描述
application/x-www-form-urlencoded 在发送前编码所有字符(默认,空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)
multipart/form-data 不对字符编码,在使用表单上传的文件时,必须使用该值
text/plain 纯文本, 空格转换为 “+” 加号,但不对特殊字符编码

application/x-www-form-urlencoded

最常见的 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

name=test&val1=1&val2=%E6%B5%8B%E8%AF%95&val3%5B%5D=2

首先,Content-Type被指定为 application/x-www-form-urlencoded;其次,提交的表单数据会转换为键值对并按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。一般当我们的key和value中遇到中文和一些特殊字符的时候([ ])就进行URL转码。

multipart/form-data

另一个常见的 POST 数据提交的方式, Form 表单的 enctype 设置为multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,类似我们上面Content-Type中的例子。
 由于这种方式将数据有很多部分,它既可以上传键值对,也可以上传文件,甚至多个文件。当上传的字段是文件时,会有Content-Type来说明文件类型;Content-disposition,用来说明字段的一些信息。每部分都是以 –boundary 开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(字段、文本或二进制等)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。

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

------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

application/json

Content-Type: application/json 作为响应头比较常见。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串,其中一个好处就是JSON 格式支持比键值对复杂得多的结构化数据。 这个Content-Type是对应了postman中raw数据格式。

POST /api/v1/quiz/questionnaire HTTP/1.1
Host: djigo-hk.djiservice.org
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 844ba7ff-9478-3924-d52e-07a79afa9d71

{"lang":"en","product_type":"42","enc_sn":"c40ffc84b2dd0a8db6dbe10a3bf7254b5fd3511a","local":"CN"}

binary (application/octet-stream)

在Chrome浏览器的Postman工具中,还可以看到”binary“这一类型,指的就是一些二进制文件类型。如application/pdf,指定了特定二进制文件的MIME类型。就像对于text文件类型若没有特定的子类型(subtype),就使用 text/plain。类似的,二进制文件没有特定或已知的 subtype,即使用 application/octet-stream,这是应用程序文件的默认值,一般很少直接使用 。

对于application/octet-stream,只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组)。

很多web服务器使用默认的 application/octet-stream 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。一般来说,设置正确的MIME类型很重要。

你可能感兴趣的:(计算机网络)