springMVC produces和ajax accept参数的配合使用 - Go语言中文社区

springMVC produces和ajax accept参数的配合使用


我的风格就是  列出例子,不过多的讲理论。

一切从一个普通的前端ajax请求jspringMVC后端的例子开始,

前端jQuery ajax 请求:

[javascript] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. $.ajax({  
  2.                 url: getAbsoluteUrl('score/findScore'),  
  3.                 type: 'POST',  
  4.                 dataType: 'json',    //第1处  
  5.                 success: function (res) {  
  6.                     alert(res);  
  7.                 },  
  8.                 error: function (msg) {  
  9.                   alert(msg);  
  10.                 }  
  11.             });  
后端 springMVC代码

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json")  
  2.     public @ResponseBody Map findScore(Model model, ServletRequest request) {  
  3.           
  4.         Map<String , Object> map = new LinkedHashMap<String, Object>();  
  5.   
  6.         map.put("createdUser","jiabaochina");  
  7.         map.put("score"5);  
  8.         map.put("status""success");  
  9.         return map;  
  10.     }  
以上的代码是没有问题的,请求后会直接alert一个js对象。

这是因为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等值来决定是否处理该请求。

如以上

  1. @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json"
含义是 :findScore对应url地址;metohd对应请求方法类型,只处理post请求。
produces = "application/json"是什么意思呢?
此种方式相对使用@RequestMapping的“headers = "Accept=application/json"”更能表明你的目的。
其实produces = "application/json"和headers = "Accept=application/json"是一个意思。
 此方法只处理 request 请求头中accept 为
"application/json"或者能够包含"application/json"的值,如“*/*”。


来,跑个例子。修改下上面的ajax请求

[javascript] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. $.ajax({  
  2.                 url: getAbsoluteUrl('score/findScore'), 
  3. headers: {
                        Accept: "text/plain; charset=utf-8"
                    }, 
  4.                 type: 'POST',  
  5.                 dataType: 'json',    //第1处  
  6.                 success: function (res) {  
  7.                     alert(res);  
  8.                 },  
  9.                 error: function (msg) {  
  10.                   alert(msg);  
  11.                 }  
  12.             });  

在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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013476542/article/details/61414551
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 22:39:05
  • 阅读 ( 753 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢