@RequestBody出现请求415问题

@RequestBody出现请求415问题首先之前也遇到过这样的问题,但是稀里糊涂的最后虽然bug修复了,但是不知道是啥原因,今天又遇到了同样的问题。问题:在前端向后台发送一个json对象(字符串),后端用@RequestBody匹配接受的时候就会出现415,如果不用@RequestBody,那么前端发送来的数据是不能被正确解析成对象里的属性的。因为用公司的框架写项目的时候,也遇见了这个问题。请教了学长,学长让我用公司自己封装的p…

大家好,又见面了,我是你们的朋友全栈君。

首先之前也遇到过这样的问题,但是稀里糊涂的最后虽然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),

以后还是要多实践,多思考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136622.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号