原文鏈接:https://blog.csdn.net/jiadajing267/article/details/87883725
1)、HTTP 協議是以 ASCII 碼 傳輸,建立在 TCP/IP 協議之上的應用層規范。規范把 HTTP 請求分為三個部分:狀態行、請求頭、消息主體。
2)、協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並沒有規定數據必須 使用什么編碼方式 。實際上,開發者完全可以自己決定消息主體的格式,只要最后發送的 HTTP 請求滿足上面的格式就可以。
3)、數據發送出去,還要服務端解析成功才有意義。一般服務端語言如 php、python 等,以及它們的 framework,都內置了自動解析常見數據格式的功能。服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。
form表單中enctype屬性可以用來控制對表單數據的發送前的如何進行編碼,enctype有三種,分別為:
multipart/form-data不對字符編碼,用於發送二進制的文件,其他兩種類型不能用於發送文件;
text/plain用於發送純文本內容,空格轉換為 "+" 加號,不對特殊字符進行編碼,一般用於email之類的;
application/x-www-form-urlencoded,在發送前會編碼所有字符,即在發送到服務器之前,所有字符都會進行編碼(空格轉換為 "+" 加號,"+"加號轉換為空格,特殊符號轉換為 ASCII HEX 值)。
其中application/x-www-form-urlencoded為默認類型。
四種post中的參數請求方式
1、application/x-www-form-urlencoded
這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 <form> 表單,如果不設置 enctype 屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數據。
<form action="form_action.asp" enctype="text/plain"> <p>First name: <input type="text" name="fname" /></p> <p>Last name: <input type="text" name="lname" /></p> <input type="submit" value="Submit" /> </form>
此時看到
Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1
首先,Content-Type 被指定為 application/x-www-form-urlencoded;其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。大部分服務端語言都對這種方式很好的支持,常用的如jQuery中的ajax請求,Content-Type 默認值都是「application/x-www-form-urlencoded;charset=utf-8
2、multipart/form-data
這也是常見的post請求方式,一般用來上傳文件,各大服務器的支持也比較好。所以我們使用表單 上傳文件 時,必須讓<form>表單的enctype屬性值為 multipart/form-data.
注意:以上兩種方式:application/x-www-form-urlencoded和multipart/form-data都是瀏覽器原生支持的
3、application/json
application/json作為響應頭並不陌生,實際上,現在很多時候也把它作為請求頭,用來告訴服務端消息主體是序列化的JSON字符串,除了低版本的IE,基本都支持。除了低版本的IE都支持JSON.stringify()的方法,服務端也有處理JSON的函數,使用json不會有任何麻煩。
4、text/xml
它是一種使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規范