springMVC produces和ajax accept引數的配合使用
我的風格就是 列出例子,不過多的講理論。
一切從一個普通的前端ajax請求jspringMVC後端的例子開始,
前端jQuery ajax 請求:
[javascript] view plain copy- $.ajax({
- url: getAbsoluteUrl('score/findScore'),
- type: 'POST',
- dataType: 'json', //第1處
-
success: function (res) {
- alert(res);
- },
- error: function (msg) {
- alert(msg);
- }
- });
- @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json")
-
public@ResponseBody
- Map<String , Object> map = new LinkedHashMap<String, Object>();
- map.put("createdUser","jiabaochina");
- map.put("score", 5);
- map.put("status", "success");
- return map;
- }
這是因為ajax請求dataType值為json,jquery就會把後端返回的json字串嘗試通過JSON.parse()嘗試解析為js物件。
http協議response返回值無論是json字串還是普通text文字還是html文字,本質上講,http response響應體就是文字內容。
而 jquery ajax 根據datatype來解析返回的文字,
簡單講datatype=‘text’時,jquery直接返回字串。
當datatype=‘json’時,jquery會呼叫JSON.parse()解析字串為js物件並且返回。
當datatype=‘html’時,jquery會在把html插入dom之前執行字串包含的js程式碼。
看完ajax後臺我們再看下springmvc後臺,@responseBody的作用是方法返回的資料不經過檢視解析,直接把map寫到response響應體中。
@requesMapping的作用是通過其所帶的value、method等值來決定是否處理該請求。
如以上
- @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json")
來,跑個例子。修改下上面的ajax請求
[javascript] view plain copy- $.ajax({
- url: getAbsoluteUrl('score/findScore'),
-
headers: {
Accept: "text/plain; charset=utf-8"
}, - type: 'POST',
- dataType: 'json', //第1處
- success: function (res) {
- alert(res);
- },
- error: function (msg) {
- alert(msg);
- }
- });
在Prototyp(1.5)的Ajax程式碼封裝中,將Accept預設設定為“text/javascript, text/html, application/xml, text/xml, */*”。這是因為Ajax預設獲取伺服器返回的Json資料模式。所以設定headers,強行制定ajax請求頭 accept為“text/plain”。
結果,後端的方法都沒進入,直接tomcat返回406錯誤。
結果和意義:
在普通的web專案中,前後端溝通很方便,甚至前後端是一個人在開發。這樣produces = "application/json"就沒有意義。
只有當在開發資料介面時,特別是呼叫方和開發方距離很遠時,通過request請求accept和produces = "application/json"的配合,
能很好的限定資料的格式,確保萬無一失。
有任何錯誤或疑問,請留言。
參考資料:
http://www.studyofnet.com/news/166.html
http://blog.csdn.net/lzwglory/article/details/17252099