HTTP常見Content-Type比較

1. application/x-www-form-urlencoded

最常見的 POST 提交數據的方式了。瀏覽器的原生 form 表單,如果不設置 enctype 屬性,那麼最終就會以 application/x-www-form-urlencoded方式提交數據。
傳遞的key/val會經過URL轉碼,所以如果傳遞的參數存在中文或者特殊字符需要注意。

//例子
//b=曹,a=1

POST  HTTP/1.1(CRLF)
Host: www.example.com(CRLF)
Content-Type: application/x-www-form-urlencoded(CRLF)
Cache-Control: no-cache(CRLF)
(CRLF)
b=%E6%9B%B9&a=1(CRLF)
//這裏b參數的值"曹"因爲URL轉碼變成其他的字符串了

2. text/xml

//例子

POST http://www.example.com HTTP/1.1(CRLF) 
Content-Type: text/xml(CRLF)
(CRLF)
<?xml version="1.0"?>
<resource>
    <id>123</id>
    <params>
        <name>
            <value>homeway</value>
        </name>
        <age>
            <value>22</value>
        </age>
    </params>
</resource>

3.application/json


//例子
//傳遞json

POST  HTTP/1.1(CRLF)
Host: www.example.com(CRLF)
Content-Type: application/json(CRLF)
Cache-Control: no-cache(CRLF)
Content-Length: 24(CRLF)
(CRLF)
{
    "a":1,
    "b":"hello"
}

4. multipart/form-data

使用表單上傳文件時,必須讓 formenctyped 等於這個值。
並且Http協議會使用boundary來分割上傳的參數

//例子
//a="曹",file1是一個文件

POST  HTTP/1.1(CRLF)
Host: www.example.com(CRLF)
//注意data;和boundary之間有一個空格,並且----WebKitFormBoundary7MA4YWxkTrZu0gW是可以自定義的
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW(CRLF)
Cache-Control: no-cache(CRLF)
Content-Length: 728
(CRLF)
//如果有Content-Length的話,則Content-Length指下面所有的字節總數,包括boundary
//這裏用自定義的boundary來進行分割,注意會在頭部加多"--"
------WebKitFormBoundary7MA4YWxkTrZu0gW(CRLF)
Content-Disposition: form-data; name="a"(CRLF)
(CRLF)
曹(CRLF)
------WebKitFormBoundary7MA4YWxkTrZu0gW(CRLF)
Content-Disposition: form-data; name="file1"; filename="1.jpg"
Content-Type: application/octet-stream(CRLF)
(CRLF)
//此處是參數file1 對應的文件的二進制數據
[654dfasalk;af&6](CRLF)
//最後一個boundary會分別在頭部和尾部加多"--"
------WebKitFormBoundary7MA4YWxkTrZu0gW--(CRLF)

//多個文件同時上傳

POST  HTTP/1.1(CRLF)
Host: www.example.com(CRLF)
//注意data;和boundary之間有一個空格,並且----WebKitFormBoundary7MA4YWxkTrZu0gW是可以自定義的
Content-Type: multipart/form-data; boundary=---------------------------418888951815204591197893077
Cache-Control: no-cache(CRLF)
Content-Length: 12138(CRLF)
(CRLF)
-----------------------------418888951815204591197893077(CRLF)
// 文件1的頭部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件1.md"(CRLF)
Content-Type: text/markdown(CRLF)
(CRLF)
// 文件1內容開始
// ...
// 文件1內容結束
-----------------------------418888951815204591197893077(CRLF)
// 文件2的頭部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件2"(CRLF)
Content-Type: application/octet-stream(CRLF)
(CRLF)
// 文件2內容開始
// ...
// 文件2內容結束
-----------------------------418888951815204591197893077(CRLF)
// 文件3的頭部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件3"(CRLF)
Content-Type: application/octet-stream(CRLF)
(CRLF)
// 文件3內容開始
// ...
// 文件3內容結束
-----------------------------418888951815204591197893077(CRLF)
// 參數username的頭部boundary
Content-Disposition: form-data; name="username"(CRLF)
(CRLF)
zhangsan
-----------------------------418888951815204591197893077(CRLF)
// 參數password的頭部boundary
Content-Disposition: form-data; name="password"(CRLF)
(CRLF)
zhangxx
-----------------------------418888951815204591197893077-- 
// 尾部boundary,表示結束

注意
(CRLF)\r\n

附上其他一些博客
http協議
HTTP協議詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章