ajax發送json數據時爲何須要設置contentType: "application/json」

1. ajax發送json數據時設置contentType: "application/json」和不設置時到底有什麼區別?
contentType: "application/json」,首先明確一點,這也是一種文本類型(和text/json同樣),表示json格式的字符串,若是ajax中設置爲該類型,則發送的json對象必需要使用JSON.stringify進行序列化成字符串才能和設定的這個類型匹配。同時,對應的後端若是使用了Spring,接收時須要使用@RequestBody來註解,這樣才能將發送過來的json字符串解析綁定到對應的 pojo 屬性上。另外,需注意一點,json字符串在書寫時名稱部分須要加上「」雙引號,以避免一些json解析器沒法識別。html

如ajax 請求時不設置任何contentType,默認將使用contentType: "application/json」application/x-www-form-urlencoded,這種格式的特色就是,name/value 成爲一組,
每組之間用 & 聯接,而 name與value 則是使用 = 鏈接。如: www.baidu.com/query?user=username&pass=password 這是get請求, 而 post 請求則是使用請求體,參數不在 url 中,在請求體中的參數表現形式也是: user=username&pass=password的形式。使用這種contentType時,對於簡單的json對象類型,如:{「a」:1,"b":2,"c":3} 這種,將也會被轉成user=username&pass=password 這種形式發送到服務端。而服務端接收時就按照正常從from表單中接收參數那樣接收便可,不需設置@RequestBody之類的註解。但對於複雜的json 結構數據,這種方式處理起來就相對要困難,服務端解析時也難以解析,因此,就有了application/json 這種類型,這是一種數據格式的申明,明確告訴服務端是什麼格式的數據,服務端只須要根據這種格式的特色來解析數據便可。ajax

總結:
1).ajax 若是發送的是json字符串,服務端接收時必需要使用@RequestBody註解。始終記住,json字符串,"application/json」,@RequestBody 這三者之間是一一對應的,要有都有,要沒有都沒有。
2).若是發送的是json對象,contentType不能設置爲"application/json」,需使用默認的類型(application/x-www-form-urlencoded,爲何呢?這種類型最後仍是會把json對象類型的參數轉爲user=username&pass=password這種形式後再發送,須要明白一點:這種轉換時只能識別json對象類型,不能識別json字符串類型)。spring

2.application/x-www-form-urlencoded 和 application/json 兩種類型的數據在後端如何接收並解析?
application/x-www-form-urlencoded 這種類型的參數提交方式有get和post兩種,這兩種方式的區別是前者把編碼後的user=username&pass=password這種形式的參數放在url上進行提交,後者是放在請求報文的請求體部分進行發送,只是發送數據時數據放的位置不同。服務端收到 user=username&pass=password 這種形式的參數後,原生的Servlet使用request.getParameter(「user」)的這種形式便可獲取參數,spring mvc 中 框架可自動根據參數名進行匹配,即表單元素的name屬性和接收參數的名稱同樣時便可自動匹配,若是不同,還可使用@RequestParam的方式匹配。json

application/json 字符串數據原生的Servlet中可使用request.getParameterMap()來獲取,但需注意,這種只能獲取Get方式傳入的數據。post傳入的須要使用輸入流的方式來讀取。在spring mvc中經過@RequestBody來解析並綁定json字符串參數到方法入參。後端

補充知識(摘錄,博文來源:https://blog.csdn.net/ff906317011/article/details/78552426):mvc

 @RequestBody 註解詳解app

做用:框架

1) 該註解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,而後把相應的數據綁定到要返回的對象上; 
2) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。post

使用時機:編碼

A) GET、POST方式提時, 根據request header Content-Type的值來判斷:

1)application/x-www-form-urlencoded, 可選(即非必須,由於這種狀況的數據@RequestParam, @ModelAttribute也能夠處理,固然@RequestBody也能處理); 
2)multipart/form-data, 不能處理(即便用@RequestBody不能處理這種格式的數據); 
3)其餘格式, 必須(其餘格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);

B) PUT方式提交時, 根據request header Content-Type的值來判斷:

application/x-www-form-urlencoded, 必須;multipart/form-data, 不能處理;其餘格式, 必須. 

 

本文轉自:https://www.cnblogs.com/hanszhao/p/10166277.html

相關文章
相關標籤/搜索