網絡協議學習——HTTP協議POST方法的格式

關於http的介紹這不贅述,主要總結下post方法裏不同形式的body的提交格式。

先談談get與post的區別

很多人說get方法比post方法安全,我本人,這是個片面的說法。在本地環境下,post的參數通常不會保存在瀏覽器歷史裏,在提交請求時,get方法的參數直接放在URL上,而post方法則是放在body裏,相比於get,post不能直接看到所提交的參數。
想象一下,如果提交的密碼是一個參數,而且用get方法,這就會直接將密碼暴露在URL中,顯然這很不安全。而post不會把參數放在URL中,就是安全的嗎?大錯特錯,下面是通過打開瀏覽器調試模式查看一個登陸請求的信息

這裏寫圖片描述

在請求信息傳輸的過程中,http協議的post方法並不能對提交的參數起到保密作用。get和post

get與post的區別應該是這樣的

方法 get post
數據長度 參數放在URL上,由於URL的長度有限,因此能提交的數據內容也很有效。 數據或參數放在body中,body可接納的數據量遠大於直接放在URL上
數據類型 只支持文本(ASCII字符),並且採用urlencode 支持文本,採用urlencode,也支持二進制,能夠用來傳輸文件

post請求的格式

post請求包含兩部分,請求頭(header)和請求體(body)。先來看一個簡單的post請求所攜帶的內容。

這裏寫圖片描述

其中該請求的body攜帶兩個參數,param1與param2,其值的java和algorithm。不難發現,參數與頭部信息之間有一“空行”,該空行就是一head與body的分割標誌,實質上是字符串”\r\n\r\n”作爲分隔線。

請求頭(header)

請求頭包含一系列與請求有關的信息,第一行 POST / HTTP/1.1 表明這是一個post請求,http版本爲1.1。
接下來的幾行都是與該請求有關的信息,其中Content-Type與content-length是來用於描述請求體(body)的數據類型和數據總長度的。

請求體(body)

請求體格式變化很靈活,可以是純文本,也可以是二進制數據。必要時需要在請求頭(header)的Content-Type屬性裏聲明。常用的純參數提交的post請求格式如下

x-www-form-urlencode格式

這裏寫圖片描述

可以發現,請求體(body)的參數實質上也是一個字符串,跟get請求放在URL後面的參數是一樣的格式,參數1=值1&參數2=值2….. 整個字符串是被urlencode的,但是這裏由於參數是純英文字母並且不包含特殊字符體現不出來。

除此之外,body還可以是其他格式類型的數據,例如純文本,純二進制(通常用來單文件傳輸)

這裏寫圖片描述
(body是任意類型純文本)

這裏寫圖片描述
(body是純二進制)

Multipart/form-data格式

既然body數據可以純文本也可以純二進制,那麼可不可以是文本和二進制的混合型呢?這必須是可以的,因此有了Multipart/form-data格式。

這裏寫圖片描述

在form-data格式裏,header裏的Content-Type的值爲 Content-Type: multipart/form-data; boundary={#boundary},接着是請求體變成了一種固定的格式,有多個提交”參數”,這裏的”參數”可以是文本信息,也可以是二進制數據信息,這裏的每一個參數被稱爲”part”,因此這種格式稱爲Multipart。

格式說明

:需要在Content-Type裏說明,表明這個請求體的格式爲Multipart/form-data。

:{#boundary}是一個隨機的字符串,緊接在Content-Type: multipart/form-data的後面,這個隨機字符串將在請求體中充當“分隔符”的角色,用來分隔多個part,在請求體的最後爲 {#boundary}– (注意是{#boundary}拼接上兩個”-“),用來表明請求體的內容到此結束。{#boundary}的值是隨機的,原則上{#boundary}的值隨機性越高越好,因爲如果每個part裏也恰好包含{#boundary}就很尷尬了,但這個概率還是很低的。

:在兩個{#boundary}之間的內容就是每一個part的數據,可以是純文本數據,也可以是二進制數據。part裏也可以被分爲header和body,這裏它爲“小頭部”吧。

當這一個part是純文本參數時,只需要聲明 Content-Disposition: form-data; name=參數名 即可,緊接着是”\r\n\r\n”分割,下面的就是參數的值了。

當這一個part是文件的二進制數據時,小頭部通常爲
Content-Disposition: form-data; name=參數名; filename=文件名
Content-Type: image/png(文件類型)

緊接着是”\r\n\r\n”分隔符,直至下一個{#boundary}分隔符出現爲止,都爲文件的二進制數據。

小結

form-urlencode 和 form-data 是常用的兩種post格式,前者的請求體內容是純文本或純二進制,常用語純文本參數的提交,單文件傳輸。 form-data能夠混合傳輸文本與二進制,相比於form-urlencode,form-data還能夠多文件傳輸。

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