AJAX data参数及后台接收注释 @RequestBody @RequestParam 的使用
在做一个功能修改时 需要往后台传一个ID参数,第一想法是直接接收一个ID 去数据库查询,因为在Controller中都用的@RequestBody 接收,接收的字符串类似“{id:“sadasfsaf56565”}”,又不想拆分,所以钻了一个牛角尖,想起原来学@RequestParam直接接收,经测试前台报400 找不到,最后为了先完成任务 用的老方法 一个对象接收了。今天上午上网查 总结一下。
首先 这是我用老方法后台接收的。
@RequestMapping(value = "/queryOrganization", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public String queryOwnAuthority(@RequestBody User user)
System.err.println(user.getId());
前端
// 获得一个勾选的集合
var select = $('#user_result_table').datagrid('getChecked');
var data = {};
data.id = select[0].id;
var param = JSON.stringify(data);
---------------------分割线----------------------------
$.ajax({
type : "POST",
url : "../user/queryOrganization",
data : param,
contentType : "application/json;charset=utf-8",
dataType : "json",
success : ........
首先 @RequestBody 与 @RequestParam 的区别。
(参考https://www.cnblogs.com/lxh520/p/8760664.html)
- @RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form- urlencoded类型)
@RequestParam可以接受简单类型的属性,也可以接受对象类型。
实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。 - @RequestBody处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。
•GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
•POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type
参数使用了解了 简单说就是@RequestBody 要ajax设置Content-Type 而且一般是非默认的,比如我们常用的ajax。
那么我又查了一下AJAX的data参数都是什么样的。可以说解决了一个坑,因为data类型必须是key-value 类型的。也就是说并不能只传一个id,所以报错。总结一下。
参考(https://www.cnblogs.com/yangguoe/p/8986108.html)
- ajax有三种传递传递data的方式:
json格式
json字符串格式
标准参数模式
1. json格式
{“username”:”chen”,”nickname”:”alien”}
2. json 字符串
“{“username”:”chen”,”nickname”:”alien”}” 或者JSON.stringify({“username”:”chen”,”nickname”:”alien”})
用此格式get请求参数传递不过去,不会把json串解析成参数 而且需要添加 contentType:”json/application”
3. 标准参数格式
“username=chen&nickname=alien”
$(“#form1”).serialize() 就是把表单的数据拼成这个格式的字符串!
这下我们发现在前台传递json字符串时,因为必须设置请求头,所以后端一般也是@RequestBody注解接收。一般接收为自定义的类型 用String接收 接收接收整个字符串 而换成@RequestParam注解前台报了400错误。
而传递另两种类型时 推荐使用@RequestParam(“xxx”) 如果不写括号 会直接赋成参数对应key的value值。
另提一嘴@RequestMapping 中的produces = “application/json;charset=UTF-8” 属性是指定返回值类型 还有字符编码。只有ajax类型的话与@ResponseBody功能相同。相对应还有一个 consumes=“application/json” 属性 方法仅处理请求头为"application/json" 的。