HTTP首部對application數據格式的設置

最近在公司實習,對HTTP數據報和前後端的交互、調接口有了更多的瞭解,特此想記錄下來,也順便分享一下。

先是接觸到了Postman這款谷歌插件,作用是用來模擬前端發送HTTP報文,在與前端聯調前供後端自己進行調試。

其中在使用Postman模擬前端發送數據時,瞭解到設置Body數據編碼有幾個知識點:

  • form-data 它會將表單的數據處理爲一條消息(一條包含所有key-value的類似json字符串),以標籤爲單元,用分隔符分開。對應header中的content-type=multipart/form-data。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有Content-Type來說明文件類型;content-disposition,用來說明字段的一些信息。由於有boundary隔離,所以multipart/form-data既可以上傳文件,也可以上傳鍵值對,它採用了鍵值對的方式,所以可以上傳多個文件。
  • x-www-form-urlencoded表示的是表單數據,對應header中的content-type=application/x-www-form-urlencoded,一般我們常用的form表單進行POST提交時,默認就是這個編碼形式。
  • raw可以上傳任意格式的文本,可以上傳text、json、xml、html等各種文本類型。當傳json格式時,相當於請求頭設置content-type=application/json,此時對應後臺SpringMVC框架的@RequestbBody Entity的接收方式。
  • binary等同於Content-Type:application/octet-stream。只可上傳二進制數據,通常用來上傳文件,由於沒有鍵值,所以一次只能上傳一個文件。

attention:
form-data與x-www-form-urlencoded不同之處在於(multipart/form-data:既可以上傳文件等二進制數據,也可以上傳表單鍵值對,只是最後會轉化爲一條信息(所有的鍵值對嵌套在一條信息裏); x-www-form-urlencoded:只能上傳鍵值對,但每個鍵值對都是一個獨立的單元。)

 

後端自己完成了調試後,在與前端進行聯調時,發現接收不到傳來的數據,debug進去後臺發現接收到的request的parameters屬性的paramHashValues爲空,也就是size=0,於是想到可能是前端傳來的數據文本類型不一致,導致後端無法接收。

爲此搜尋到兩篇博客,提供瞭解決的思路,特此記錄一下:

https://blog.csdn.net/oxluan/article/details/78284674 vue-resource post請求的坑

https://blog.csdn.net/weixin_39716452/article/details/79034210 application/x-www-form-urlencoded還是application/json

最後發現前端傳來的是一行jason數據序列,而後臺代碼使用的是公司自己搭建的框架,需要根據原始的request去getParametersMap再去根據迭代器逐個將表單提交的key-value數據提取出來存到一個繼承了HashMap的通用實體對象PageData中。這個要求HTTP頭部的Content-Type爲application/x-www-form-urlencoded而不是application/json,否則會接收不到數據,而且數據提交的方式必須是按照原始表單以key-value值一個鍵值對爲一個單位來傳,不能將所有鍵值對都包含在一行序列單位,這個涉及到前端框架vue的一些提交表單的方式,需要前後端統一協調好(一般是以後臺爲基準~)。

 

總結:

當你需要使用content-type=application/json且後臺使用@RequestBody,你無法再從原始的request的paramter中獲取請求數據。選擇application/x-www-form-urlencoded還是application/json,得看你是否有從request.paramter獲取請求數據的需求。一般用SpringMVC框架都會封裝好request,開發者不需要操作request底層,所以可不用考慮這個問題,根據主流的規範來操作應該是沒有大的問題。然鵝,好的企業往往會自己開發搭建合適的框架,而不用市面上流行的開源框架,所以,我們也得多瞭解些。

 

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