@RequestBody出现请求415问题
大家好,又见面了,我是你们的朋友全栈君。
首先之前也遇到过这样的问题,但是稀里糊涂的最后虽然bug修复了,但是不知道是啥原因,今天又遇到了同样的问题。
问题:在前端向后台发送一个json对象(字符串),后端用@RequestBody匹配接受的时候就会出现415,如果不用@RequestBody,那么前端发送来的数据是不能被正确解析成对象里的属性的。
因为用公司的框架写项目的时候,也遇见了这个问题。请教了学长,学长让我用公司自己封装的post请求方法去请求,结果415bug就不见了。于是开始怀疑是自己的问题。
废话不多说了,上代码 js: 注意1:这两项必须配置,这样json才能正确的转换 dateType:“json”, contentType : ‘application/json’, 这个地方尤其要注意一定要指定contentType的值为『“application/json”』 ,因为此处@RequestBody接受的是一个通过json转换的对象 //如果不设置,默认为text/html,那么是支持该种类型的,会报415错误
注意2:data:JSON.stringify(this.queryParam) 因为对象是不能在网络中传输的,网络只能识别字符串,所以我们这里要把JSON对象转换成JSON字符串。后台的@RequestBody的作用是将传过来的字符串转换成对象,然后将该对象里的属性绑定到controller的对象参数的对应属性里。注:前台穿过来的json对象的key,一定要和实体类中共的属性对应,否则是绑定不成功的。
pageUserList:function () {
$.ajax({
type:"post",
url:"/customer/pageData.do",
dateType:"json",
contentType : 'application/json',
data:JSON.stringify(this.queryParam),
success:function(result){
app.userList=result.rows;
app.pagination.total=result.total;
// 重新加载数据,即重新请求数据,并加载
console.log(app.userList);
// data:JSON.stringify(this.queryParam),
// 因为对象是不能在网络中传输的,(Json对象也是对象),所以这里要将json对象转换成json字符串
// 然后再传输,后台的springmvc的@RequesyBody会将json字符串再转换成对象
//这个地方尤其要注意一定要指定contentType的值为『"application/json"』 ,因为此处@RequestBody接受的是一个通过json转换的对象
//如果不设置,默认为text/html,那么是支持该种类型的,会报415错误
}
});
controller
@RequestMapping("/customer/pageData.do")
@ResponseBody
public MyPage pageData(@RequestBody MyPage myPage){
System.out.println(myPage.getPageSize()+"===="+myPage.getPageNumber());
return customerService.pageData(myPage);
}
@RequesyBody
@RequestBody
作用:
i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
iii)@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。所以如果前端ajax传过来的是application/x-www-form-urlcoded然后后台用springMvc的@requestBody Object obj 因为类型不一致 此时也是会报415错误的
使用时机:
A) GET、POST方式提时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);
B) PUT方式提交时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 必须;
multipart/form-data, 不能处理;
其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;
@ResponseBody
@ResponseBody
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
注:推荐一个将@RequesyBody和@ResponseBody比较好的帖子 https://www.cnblogs.com/qq78292959/p/3760651.html
ps:知道网络不能传递对象,只能传递字符串,但是当真正写代码的时候还是不懂为什么要这样写
data:JSON.stringify(this.queryParam),
以后还是要多实践,多思考
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136622.html原文链接:https://javaforall.cn
相关文章
- 安装调试MySql经常遇到的问题
- 解决pycharm添加python2.7解释器出现Failed to create virtual environment和添加python3.8解释器SDK无效问题[通俗易懂]
- 分库分表后,数据库数据一致性问题如何解决?
- journalctl 日志问题
- 解决double转 BigDecimal 时出现的精度失真问题
- 服务器终端乱码问题
- 记一次通过K8S ingress访问业务服务出现404问题
- 量子计算结果的真实性问题——量子计算验证协议
- 详解CentOS8更换yum源后出现同步仓库缓存失败的问题
- MySQL.. ERROR! The server quit without updating PID file问题解决详解数据库
- Android开发中遇到的问题(五)——Eclipse导入Android项目出现”Invalid project description overlaps the location of another project”错误的解决办法详解手机开发
- VisualVM 分析full GC问题记录详解编程语言
- 避免MySQL DDL锁导致的性能问题(ddl锁mysql)
- Oracle转义来解决下划线问题(oracle转义下划线)
- 产后抑郁≠娇气 发现问题要及时干预
- 如何解决MySQL导出文件中出现问号的问题(mysql导出问号)
- 解决Oracle数据库锁表问题(oracle中解决锁表)
- 如何解决MySQL出现的段错误问题(mysql_ 段错误)
- 方案借助Redis攻克雪崩效应解决队列性能问题(redis雪崩队列解决)
- 使用Redis锁集群解决分布式系统问题(redis锁集群解决方案)
- Oracle数据库持续出现报错问题(oracle一直报错)
- Oracle数据库连接遇到持久问题(oracle一直不能连接)
- javascript程序优化问题
- win2003servicepack2IIS无法复制CONVLOG.EXECONVLOG.EX_问题处理
- phpcurlpost时出现的问题解决