POST提交數據方式
協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並沒有規定數據必須使用什么編碼方式。實際上,開發者完全可以自己決定消息主體的格式,只要最后發送的 HTTP 請求滿足上面的格式就可以。
但是,數據發送出去,還要服務端解析成功才有意義。一般服務端語言如 php、python 等,以及它們的 framework,都內置了自動解析常見數據格式的功能。服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。所以說到 POST 提交數據方案,包含了 Content-Type 和消息主體編碼方式兩部分。
application/x-www-form-urlencoded.
HTTP的消息體以查詢字符串的方式發送(名/值對,用&分割,名字和值用=連接).其中非字母數字的字符用'%HH'替換。(HH是十六進制)
multipart/form-data
-
每一部份用分開的MIME消息(文件的類型)表示。
-
並且,每一部份被特定的字符邊界分開(boundary=---------------------------735323031399963166993862150).這個字符邊界精心挑選一遍不會和內容重復。
-
每一部份有自己的MIME頭(content-type).通過這個值可以選擇更有效率的方式存儲值,以節省帶寬。(base64或者raw binary)
POST / HTTP/1.1 [[ Less interesting headers ... ]] Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150 Content-Length: 834 -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text1" text default -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text2" aωb -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file1"; filename="a.txt" Content-Type: text/plain Content of a.txt. -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <!DOCTYPE html><title>Content of a.html.</title> -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file3"; filename="binary" Content-Type: application/octet-stream aωb -----------------------------735323031399963166993862150--
application/json
application/json 這個 Content-Type 作為響應頭大家肯定不陌生。實際上,現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化后的 JSON 字符串。由於 JSON 規范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什么麻煩
text/xml
用的比較少了
application/x-www-form-urlencoded VS multipart/form-data兩者區別
-
文件內容的上傳必須用multipart/form-data
-
簡單的字符串key-value對(大部分form-data的情況),用application/x-www-form-urlencoded更簡單有效。用multipart就會添加一些不必要的額外字符串了。