原文地址:https://www.jianshu.com/p/63c21bfd1910
1、AJAX DATA怎么傳輸的問題
在contentType默認值: "application/x-www-form-urlencoded"的情況下
在調用JQUERY的$.ajax函數時候的data屬性中,無論是POST還是GET,假如要傳輸的data是對象obj,我們可以直接寫
data:obj ,也可以 data:$.param(obj)
原因在於AJAX能夠自動判斷data的類型,如果是字符串則直接傳輸,如果是對象則會先調用$.param(obj)再進行傳輸,源碼如下
//在ajax()方法中,對json類型的數據進行了$.param()處理 if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional );
下面是W3C上對於AJAX的DATA選項的一個說明
data
類型:String
發送到服務器的數據。將自動轉換為請求字符串格式。GET 請求中將附加在 URL 后。查看 processData 選項說明以禁止此自動轉換。必須為 Key/Value 格式。如果為數組,jQuery 將自動為不同值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換為 '&foo=bar1&foo=bar2'。
2、GET POST傳輸方式對於DATA的影響
在contentType默認值: "application/x-www-form-urlencoded"的情況下
上面說了data:可以接對象也可以接對象轉換后的查詢字符串,最終都是傳輸查詢字符串
對於GET,data查詢字符串會直接拼接在URL后面傳輸到后台
比如/query?x=bar1&y=bar2,后台接收的時候直接requestParam接收就行了。
對於POST,data查詢字符串不會直接接在URL后面,而是以請求體的方式保存在FORM DATA中進行傳輸
比如x=bar1&y=bar2,后台接收的時候仍然是直接@RequestParam接收就行了,但是數據不會顯示在URL后面,URL仍然是/query
如果contentType是 "application/json"的話
對於GET,data查詢字符串仍然是會直接拼接在URL后面傳輸到后台,沒有影響
對於POST,data仍是以請求體的方式進行傳輸,但是卻是保存在REQUEST PAYLOAD中,這種方式就沒辦法直接用@RequestParam接收,而是要使用到@RequestBody,這就跟Spring MVC的消息轉換機制有關了。
不僅僅是application/json,對於上傳文件等等的contentType,data也都是保存在REQUEST PAYLOAD中。
如果POST既要上傳文件又要上傳一些參數的,一種是直接在POST的URL后面拼接參數,然后FormData中只保留數據文件;另一種就是文件和參數都放在FormData也是沒有問題的。
另外上傳文件方面還要注意一下AJAX的processData這個選項,要設置為 false
processData
類型:Boolean
默認值: true。默認情況下,通過data選項傳遞進來的數據,如果是一個對象(技術上講只要不是字符串),都會處理轉化成一個查詢字符串,以配合默認內容類型 "application/x-www-form-urlencoded"。如果要發送 DOM 樹信息或其它不希望轉換的信息,請設置為 false。
作者:晚歌y
鏈接:https://www.jianshu.com/p/63c21bfd1910
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。