$.ajax({ type: httpMethod, cache:false, async:false, contentType: "application/json; charset=utf-8", dataType: "json",//返回值類型 url: path+url, data:jsonData, success: function(data){ var resultData = '返回碼='+data.status+',響應(yīng)結(jié)果='+data.message+',耗時(shí)='+data.tcost; layer.msg(resultData,{icon: 1}); }, error : function(xhr, ts, et) { layer.msg('服務(wù)調(diào)用失敗!', {icon: 2}); } });
contentType: 發(fā)送信息至服務(wù)器時(shí)內(nèi)容編碼類型,簡單說告訴服務(wù)器請求類型的數(shù)據(jù)。
默認(rèn)值: "application/x-www-form-urlencoded"。
dataType:告訴服務(wù)器,我要想什么類型的數(shù)據(jù),除了常見的json、XML,還可以指定 html、jsonp、script或者text
不使用contentType: “application/json”則data可以是對象。
$.ajax({ url: actionurl, type: "POST", datType: "JSON", data: { id: nodeId }, async: false, success: function () {} });
使用contentType: “application/json”則data只能是json字符串。
$.ajax({ url: actionurl, type: "POST", datType: "JSON", contentType: "application/json" data: "{'id': " + nodeId +"}", async: false, success: function () {} });
1. ajax發(fā)送json數(shù)據(jù)時(shí)設(shè)置contentType: "application/json”和不設(shè)置時(shí)到底有什么區(qū)別?
contentType: "application/json”,首先明確一點(diǎn),這也是一種文本類型(和text/json一樣),表示json格式的字符串,如果ajax中設(shè)置為該類型,則發(fā)送的json對象必須要使用JSON.stringify進(jìn)行序列化成字符串才能和設(shè)定的這個(gè)類型匹配。同時(shí),對應(yīng)的后端如果使用了Spring,接收時(shí)需要使用@RequestBody來注解,這樣才能將發(fā)送過來的json字符串解析綁定到對應(yīng)的 pojo 屬性上。另外,需注意一點(diǎn),json字符串在書寫時(shí)名稱部分需要加上“”雙引號,以免一些json解析器無法識別。
如ajax 請求時(shí)不設(shè)置任何contentType,默認(rèn)將使用contentType: "application/json”application/x-www-form-urlencoded,這種格式的特點(diǎn)就是,name/value 成為一組,
每組之間用 & 聯(lián)接,而 name與value 則是使用 = 連接。如: www.baidu.com/query?user=username&pass=password 這是get請求, 而 post 請求則是使用請求體,參數(shù)不在 url 中,在請求體中的參數(shù)表現(xiàn)形式也是: user=username&pass=password的形式。使用這種contentType時(shí),對于簡單的json對象類型,如:{“a”:1,"b":2,"c":3} 這種,將也會被轉(zhuǎn)成user=username&pass=password 這種形式發(fā)送到服務(wù)端。而服務(wù)端接收時(shí)就按照正常從from表單中接收參數(shù)那樣接收即可,不需設(shè)置@RequestBody之類的注解。但對于復(fù)雜的json 結(jié)構(gòu)數(shù)據(jù),這種方式處理起來就相對要困難,服務(wù)端解析時(shí)也難以解析,所以,就有了application/json 這種類型,這是一種數(shù)據(jù)格式的申明,明確告訴服務(wù)端是什么格式的數(shù)據(jù),服務(wù)端只需要根據(jù)這種格式的特點(diǎn)來解析數(shù)據(jù)即可。
總結(jié):
1).ajax 如果發(fā)送的是json字符串,服務(wù)端接收時(shí)必須要使用@RequestBody注解。始終記住,json字符串,"application/json”,@RequestBody 這三者之間是一一對應(yīng)的,要有都有,要沒有都沒有。
2).如果發(fā)送的是json對象,contentType不能設(shè)置為"application/json”,需使用默認(rèn)的類型(application/x-www-form-urlencoded,為什么呢?這種類型最后還是會把json對象類型的參數(shù)轉(zhuǎn)為user=username&pass=password這種形式后再發(fā)送,需要明白一點(diǎn):這種轉(zhuǎn)換時(shí)只能識別json對象類型,不能識別json字符串類型)。
2.application/x-www-form-urlencoded 和 application/json 兩種類型的數(shù)據(jù)在后端如何接收并解析?
application/x-www-form-urlencoded 這種類型的參數(shù)提交方式有g(shù)et和post兩種,這兩種方式的區(qū)別是前者把編碼后的user=username&pass=password這種形式的參數(shù)放在url上進(jìn)行提交,后者是放在請求報(bào)文的請求體部分進(jìn)行發(fā)送,只是發(fā)送數(shù)據(jù)時(shí)數(shù)據(jù)放的位置不一樣。服務(wù)端收到 user=username&pass=password 這種形式的參數(shù)后,原生的Servlet使用request.getParameter(“user”)的這種形式即可獲取參數(shù),spring mvc 中 框架可自動根據(jù)參數(shù)名進(jìn)行匹配,即表單元素的name屬性和接收參數(shù)的名稱一樣時(shí)即可自動匹配,如果不一樣,還可以使用@RequestParam的方式匹配。
application/json 字符串?dāng)?shù)據(jù)原生的Servlet中可以使用request.getParameterMap()來獲取,但需注意,這種只能獲取Get方式傳入的數(shù)據(jù)。post傳入的需要使用輸入流的方式來讀取。在spring mvc中通過@RequestBody來解析并綁定json字符串參數(shù)到方法入?yún)ⅰ?/p>