关于spring-mvc中使用ajax调用后台接口出现400 bad request的问题解决方案

经过一段时间的学习。发现之前写的这篇博客

关于ajax 调用后台 出现400bad request  有很大问题。特地重新编辑。

先描述下我的问题:

前端代码:

function test() {
        $.ajax({
            url:'../app/bg/shop/updateShopByShopId',
            type:'POST',
            data:{shopId:"000003",address:"广东省深圳市深大地铁站"},
            dataType:"JSON",
            contentType:"application/json",
            async:'true',
            success:function(result) {
                console.info(JSON.stringify(result))
            }
        })
    }

后台代码:


错误提示:400 bad request.    'xxx'   parameter is not present。

错误解释:这个错误  说明  后台 没有接收到 xxx 这个参数。

可是大家都看到了,ajax中含有参数。

错误原因:通过对spring的了解,发现 @RequestParam 这个注解  是通过 request.getParameter() 这个方法来获取参数的。而你的contentType类型决定了后台要以什么方式进行解析。

当contentType类型为 application/json 时,如果你配置了spring 的 Json转换器。那么它会按照你声明的类型进行解析,这个时候需要使用注解@RequestBody 来进行接收,比如@RequestBody Map<String,Object> map ,或者 @RequestBody JSONObject json.

当contentType类型为 application/x-www-form-urlencoded,它相当于form表单提交,数据会被编码为key/value格式发送到服务器(表单默认的提交数据的格式),而这个时候后台就可以 通过 request.getParameter()方法来进行接收,所以用@RequestParam注解也就可以了

总结:

1.如果后台是使用注解@RequestParam 来进行接收参数的话,那么 ajax 就不用添加contentType为application/json,它默认的application/x-www-form-urlencoded就是我们所需要的。

2.如果后台你声明了具体的类型来接收参数,那么你就需要设置  contentType类型为 application/json。同时配置Spring的 Json转换器,它的作用是 将传递过来的Json进行序列化成你声明的类型。

下面讲下springmvc 关于 Json 转换的配置:

<mvc:annotation-driven>
        <!-- 不使用默认的消息转换器 -->
        <mvc:message-converters register-defaults="false">
            <!-- 配置Spring的转换器 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
            <!-- 配置fastjson中实现HttpMessageConverter接口的转换器 -->
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <!-- 加入支持的媒体类型,返回contentType -->
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

调用成功案例:
前端-

function test() {
        $.ajax({
            url:'../app/bg/product/addSery',
            type:'POST',
            data:JSON.stringify({name:"尊享咖啡",shopId:"000001"}),
            dataType:"JSON",
            contentType:"application/json",
            async:'true',
            success:function(result) {
                console.info(JSON.stringify(result))
            }
        })
    }

后端接收-


后端接收 model,ProductSery

欢迎大家点赞!!


--------------------- 
作者:huwenyong123 
来源:CSDN 
原文:https://blog.csdn.net/qq_31138523/article/details/60584333 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_34207444/article/details/83218199