http Content-Type 知多少 (2)

其中boundary指明了请求体中每部分的分割符(对于multipart的类目,都会存在该字段,以区分请求体中数据的分割),其请求体中则是对应表单每部分的内容。每部分都会有自己的请求体和相关内容。
例如如下的文档结构:

<form action="http://localhost:8000/" method="post" enctype="multipart/form-data"> <input type="text"> <input type="checkbox">Check</input> <input type="file"> <button>Send the file</button> </form>

其请求信息如下:

POST / HTTP/1.1 Host: localhost:8000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 // 以 ---------------------------8721656041911415653955004498 作为分割符 Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498 Content-Length: 465 -----------------------------8721656041911415653955004498 // 分段一 文本相关信息 Content-Disposition: form-data; // 对应value Test -----------------------------8721656041911415653955004498 // checkbox Content-Disposition: form-data; on -----------------------------8721656041911415653955004498 // 文件 Content-Disposition: form-data;; filename="test.txt" Content-Type: text/plain Simple file. -----------------------------8721656041911415653955004498--

application/javascript application/x-javascript text/javascript
对于js文件,常见MIME类型为text/javascript,但是前两种应该会有见到过。三者之间多少还是有点区别的。
传统的js程序对应的MIME类型为text/javascript,其他的还有"application/x-javascript"(x前缀表示这是实验性类型), 因为text/javascript是最常见的类型,所以RFC4329定义了“text/javascript”。不过,js文件实际上并不是真正的文本类型,因此推出了application/javascript类型,不过现行的支持性并不好,所以常常会用application/x-javascript来代替。

application/zip application/gzip
zip 对应zip压缩文件,gzip是若干种文件压缩程序的简称,通常指GNU计划的实现,此处的gzip代表GNU zip。

application/http
这一种大家可能就不常见了,从类型可以知道,是http请求,但具体用途还是要翻下规范才能找到的。
此类型包含的http请求包含在binary消息体中,在邮件协议传输中需要指明Content-Transfer-Encoding。
在批量处理请求时会遇到,其表现如下:

--batch_0123456789 Content-Type: application/http Content-ID: // 必须的字段,表明传送内容的编码格式 即二进制流 Content-Transfer-Encoding: binary POST https://www.googleapis.com/analytics/v3/management/accounts/XXXXXX/webproperties/UA-XXXXXX-1/customDimensions Content-Type: application/json Content-Length: 68 { "name": "Campaign Group", "scope": "SESSION", "active": true } multipart类型

正如上文所述,multipart一般对应单个消息头对应多个消息体。
常见语法如下:

Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p

其中boundary字段是必须的,用于区分消息体中的数据边界,一般是两个\'-\'的格式作为该端的开头,例如:

--gc0p4Jq0M2Yt08jU534c0p

我们主要关注的也就是下面几种:

multipart/form-data
见上面application部分。下面这几部分可能不是那么常见,不过还是可以了解一下,以免遇到的时候懵逼。

multipart/mixed
该类型用于,消息体由多个独立的部分组成且想连续的展示。并且子数据类型有任一种无法被识别(此处指被浏览器直接识别的类型,例如text等)的类型时,都应该为mixed。
概括而言就是该邮件有二进制内容,非可以直接识别的内容

例如:

POST /batch/farm/v1 HTTP/1.1 Authorization: Bearer your_auth_token Host: Content-Type: multipart/mixed; boundary=batch_foobarbaz Content-Length: total_content_length --batch_foobarbaz // 子内容为http请求 不过是boundary编码过的 Content-Type: application/http Content-ID: <item1:12930812@barnyard.example.com> GET /farm/v1/animals/pony --batch_foobarbaz Content-Type: application/http Content-ID: <item2:12930812@barnyard.example.com> PUT /farm/v1/animals/sheep Content-Type: application/json Content-Length: part_content_length If-Match: "etag/sheep" { "animalName": "sheep", "animalAge": "5" "peltColor": "green", } --batch_foobarbaz Content-Type: application/http Content-ID: <item3:12930812@barnyard.example.com> GET /farm/v1/animals If-None-Match: "etag/animals" --batch_foobarbaz--

这里消息体中的内容就是http请求,在google批量接口协议中用使用。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgppj.html