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解析器無法識別。
如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 這種型別,這是一種資料格式的申明,明確告訴服務端是什麼格式的資料,服務端只需要根據這種格式的特點來解析資料即可。
總結:
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字串型別)。
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的方式匹配。
application/json 字串資料原生的Servlet中可以使用request.getParameterMap()來獲取,但需注意,這種只能獲取Get方式傳入的資料。post傳入的需要使用輸入流的方式來讀取。在spring mvc中通過@RequestBody來解析並繫結json字串引數到方法入參。