HTTP詳解(五):HTTP POST方法傳輸多種類型的數據

HTTP詳解(五):HTTP POST方法傳輸多種類型的數據

HTTP POST方法傳輸多種類型的數據

上篇文章,聽我嘀咕了一下如何實現HTTP的請求,主要是GET和POST請求兩種方法。
其中在講述POST方法的實現時,我簡單拿了傳輸最普通字符串來簡單的說明了一下。但是實際應用中,可能會面對各種各樣的傳輸需求,比如說傳輸XML報文,JSON類型的數據,傳輸Multipartfile類型的數據等等,傳輸不同類型的數據的要求不一樣,所以呢,咱們繼續說一說如何去傳輸這些類型的數據。
在"HTTP報文格式"中,我曾經說道HTTP 請求頭中,有一個十分重要的屬性:Content-Type,該屬性的設定主要是HTTP提交的內容類型。HTTP傳輸不同類型的數據,就需要指定Content-Type,只有指定了Content_Type,HTTP纔會知道你傳輸的內容是什麼格式,才能進行相應的轉化方便傳輸。
傳輸XML格式的報文:


在上面那段代碼中,其實最主要的一行就是將Content-Type 設置成"text/xml"。其實在應用中,傳輸XML報文時Content-Type類型的設定,一般情況下有兩種:application/xml 和text/xml 這兩種。
其實呢,這兩種類型除了編碼的不同,其他的我暫時沒有發現特別大的區別,當然了長得也不一樣。到底編碼上有什麼不同呢,彆着急,咱們慢慢說。
我們先來看一段XML報文
<?xml version="1.0" encoding="utf-8"?>
上面那一段XML頭,裏面指定了版本信息和編碼。如果你用application/xml來傳輸XML報文,XML報文的編碼格式就是UTF-8;如果你使用的是text/xml,採用的編碼us-ascii編碼。
綜上所述,application/xml 採用的編碼格式是XML頭中的編碼,text/xml採用的是us-ascii編碼。對於什麼是us-ascii,童鞋們自行百度,我就不贅述了。

傳輸JSON類型的數據:
其實,關於JSON是什麼,在這裏我就不對贅述,畢竟這篇文章主要不是說JSON,後面有機會的話,我們專門寫一片文章來說一下JSON。在這裏啊,大家只需要知道它是一種輕量級數據交換格式。那好我們來看一下如何傳輸JSON格式的數據


其實,大家可以看出來傳輸JSON格式的數據,就是將Content-Type設置爲"text/json"就可以了,在這裏我就不贅述了。
通過上面兩個示例,大家可能會覺得HTTP傳輸不同類型的數據簡直是簡單的不能再簡單了,只要簡單的設置一下Content-Type就行啦。你要這麼覺得,小夥子你就太年輕了~


在實際應用中,我們經常會需要通過表單上傳文件,比如說以下這種情況

再比如說咱們寫郵件的時候的添加附件,都是通過POST請求去傳輸的。注意哈,在這裏我沒說是通過HTTP POST傳輸的,原因是,現在很多網站都會選擇HTTPS去傳輸,到底什麼是HTTPS,和HTTP有什麼樣的關係,後面咱們再細聊HTTPS.
通過表單去上傳文件,就是涉及到一種請求類型,叫做Multipart/form-data請求,它是什麼呢,大家只需要知道:
Multipart/form-data就是使用表單上傳文件時的一種格式。當然這句話並不嚴謹,有時候我們不通過表單上傳文件也需要將Content-Type設置成這種類型(啪啪打自己的臉)。
那我們來看一下當我們上傳了一個文件之後,HTTP報文是什麼樣子的呢。好,我們將上圖中excel文件上傳看一下HTTP報文中將excel解析之後是個什麼樣子。

上圖中主要就是上傳excel時的請求頭,我們重點看一下Content-Type,可以看出Content-Type=multipart/form-data; boundary=---------------------------3618134789,其中將Content_Type設置成multipart/form-data格式,但是後面還有boundary,這是個什麼東西,百度翻譯一下,是“邊界”的意思,也就是分隔符!
我們來詳細說一下,boundary有什麼用處。
就一句話:用來隔開提交的表單中不同部分的數據或者分割多個文件。在提交multipart/form-data請求時,設置Content_Type屬性時,必須要同時指定所使用的boundary,否則上傳過程中會報錯,導致上傳不成功。
我們是可以自己去設定boundary的內容,但不要過於簡單,避免和上傳的內容重複。
我們來看一下上傳是HTTP請求體的內容。

我們可以看到分隔符在報文體的頭和尾都有,但是仔細看,會發現,尾部的分隔符要比頭部的分隔符後面多“--”,用來表示表單的結束。因此,這裏會引出一個非常重要的一個HTTP協議的規範:HTTP multipart/form-data請求時結束分割符比開始分隔符尾部多兩位“--”,每個字段或者文件之間用“--分隔符”進行分割,最後一個分割符“--分隔符--”用來表示結束。這個很關鍵。如果不滿足這個條件,是會出錯的。
好了,總結一下,如果我們通過HTTP提交multipart/form-data請求時,必須要做的兩件事情:
第一,必須設定Content-Type屬性值爲multipart/form-data,否則它會以默認的application/x-www-form-urlencoded格式提交請求,會報錯。
第二,必須指定boundary,也就是分隔符,並且要保證結束分隔符比開始分割符後面多兩個“--”
好了,我們拿一個實例來看一下。
需求:與某公司進行接口對接,需要通過HTTP上傳文件,某公司接口標準上傳文件類型必須是Multipartfile 文件。
需求分析:Multipartfile是表單提交上傳文件時的一種文件類型,Spring中通常使用Multipartfile進行文件上傳,通過HTTP上傳文件時需要將Content-Type設置爲multipart/form-data
那咱們開始寫吧。


以上是我用原生JAVA方法實現的,能從發原理實現上去了解multipart/form-data請求的發送,老鐵們注意以上標紅的地方,是關鍵所在!當然,也可以通過HttpClient這種封裝好的開源框架進行實現,大家可以自行嘗試一下,只要你理解了我上面所說的,問題不大!
好了,這篇文章就先到這裏,主要是講解了一下通過POST請求傳輸XML,JSON,數據以及上傳文件

發佈了7 篇原創文章 · 獲贊 18 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章