Ajax POST请求 415 Unsupported Media Type springMVC中使用 RequestBody

使用POST请求的时候一直报错:  

Ajax 未设置 contentType 时会报 415 。

后台 RequestBody  承接前台参数,故对参数data的要求为“必传”“JSON”,否则会报400.

@RequestMapping(value="/venueDetail")
    @ResponseBody
    public Map<String,Object> getVenueDetail(@RequestBody Map<String, Object> paraMap,HttpServletRequest request){

 

参见 : http://www.2cto.com/kf/201312/262557.html

原因如下:

  在SprinvMVC的Web程序中,我在页面发送Ajax 的POST请求,然后在服务器端利用@requestBody接收请求body中的参数,当时运行过程中,我想服务器发送Ajax请求,浏览器一直反馈415 Unsupported Media Type或者400的状态码,以为是Ajax写的有问题。便查找了半天资料,才发现spring-mvc.config文件的配置中少了东西,当然也有可能是你真的在Ajax中缺少了对Content-Type参数的设置。分析后应该是我springMVC-config.xml文件配置有问题。

(注):400:(错误请求) 服务器不理解请求的语法。 415:(不支持的媒体类型) 请求的格式不受请求页面的支持。

 

解决方法: 

  在springMVC-config.xml文件中,增加了一个StringHttpMessageConverter请求信息转换器,配置片段如下:

复制代码

<!--- StringHttpMessageConverter bean -->

< bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/>

 

<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->

< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >

       < property name= "messageConverters" >

             < list>

                 < ref bean= "mappingJacksonHttpMessageConverter" />

                 <!-- 新增的StringMessageConverter bean-->

                 < ref bean= "stringHttpMessageConverter" />

                 < ref bean= "jsonHttpMessageConverter" />           

                 < ref bean= "formHttpMessageConverter" />

             </ list>

        </ property>

</ bean>

复制代码

 

 

HttpMessageConverter请求信息转换器简介:

 

  HttpMessageConverter接口指定了一个可以把Http request信息和Http response信息进行格式转换的转换器。通常实现HttpMessageConverter接口的转换器有以下几种:

ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;

StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据;

 ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据; 

FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;

MappingJacksonHttpMessageConverter:  负责读取和写入json格式的数据;

SourceHttpMessageConverter:                   负责读取和写入 xml 中javax.xml.transform.Source定义的数据;

Jaxb2RootElementHttpMessageConverter:  负责读取和写入xml 标签格式的数据;

AtomFeedHttpMessageConverter:              负责读取和写入Atom格式的数据;

RssChannelHttpMessageConverter:           负责读取和写入RSS格式的数据;

(注)更多关于HttpMessageConverter的信息请看:http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/http/converter/HttpMessageConverter.html

 

HttpMessageConverter请求信息转换器执行流程:

   当用户发送请求后,@Requestbody 注解会读取请求body中的数据,默认的请求转换器HttpMessageConverter通过获取请求头Header中的Content-Type来确认请求头的数据格式,从而来为请求数据适配合适的转换器。例如contentType:applicatin/json,那么转换器会适配MappingJacksonHttpMessageConverter。响应时候的时候同理,@Responsebody注解会启用HttpMessageConverter,通过检测Header中Accept属性来适配的响应的转换器。

 

总结:

  当在使用SpringMVC做服务器数据接收时,尤其是在做Ajax请求的时候,尤其要注意contentType属性,和accepte 属性的设置,在springmvc-config.xml中配置好相应的转换器。当我们在用SpringMVC做 Ajax 请求的时候,有的做法用response.getWriter().print()的方法,还有更好的方法就是添加@Responsebody注解,直接返回Map类型的数据,转换器自动转换为JSON数据类型。

 

下面为本人解决方式:

<bean id="mappingJacksonHttpMessageConverter"  
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>  
                <value>text/html;charset=UTF-8</value>  
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>  
    </bean>
    <!--- StringHttpMessageConverter bean -->
    <!--<bean id = "stringHttpMessageConverter" class = "org.springframework.http.converter.StringHttpMessageConverter"/>-->
    <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->  
    <bean  
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">  
            <list>  
                <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 -->
                <!-- 新增的StringMessageConverter bean-->
                <!--<ref bean= "stringHttpMessageConverter" />-->
                <!--<ref bean= "jsonHttpMessageConverter" />-->
                <!--<ref bean= "formHttpMessageConverter" />-->
            </list>  
        </property>  
    </bean>  

上面转换器代码里面只是加了一句:<value>application/json;charset=UTF-8</value>

 

<think>嗯,用户遇到了415 Unsupported Media Type错误,而且提到请求没有触发后端的断点,说明请求还没到控制器就被拦截了。首先,我得回忆一下常见的导致415错误的原因。根据之前的经验,通常是因为请求的Content-Type和后端处理方式不匹配。 用户提到前端用的是application/x-www-form-urlencoded格式,而后端用了@RequestBody注解。这里可能存在矛盾,因为@RequestBody通常用来处理application/json格式的数据,而x-www-form-urlencoded的数据在Spring MVC中一般是通过@RequestParam或者直接绑定到对象参数,不需要@RequestBody。所以第一个可能的问题就是@RequestBody使用不当,导致Spring无法解析请求体。 接下来,用户可能缺少了必要的解析器。比如,如果后端需要处理JSON数据,但没有添加Jackson库,Spring就无法解析请求体,导致415错误。引用[3]中提到的缺少jackson-databind依赖可能就是这个问题。需要检查pom.xml或build.gradle文件,确保相关依赖存在。 另外,请求头中的Content-Type是否正确设置也很重要。前端发送的Content-Type必须和后端期望的一致。如果前端发送的是x-www-form-urlencoded,而后端期望的是JSON,就会出问题。这时候需要检查前端的请求配置,确认Content-Type是否正确,或者后端是否需要调整接受的媒体类型。 还有可能是Spring的配置问题,比如没有启用相应的消息转换器。例如,如果没有配置FormHttpMessageConverter,处理x-www-form-urlencoded的数据时可能会失败。这时候需要检查Spring的配置类,确保有适当的转换器被注册。 解决方案方面,首先应该移除@RequestBody,因为x-www-form-urlencoded的数据不需要它。然后添加必要的依赖,比如Jackson库。同时,确保前端正确设置了Content-Type头。如果用户确实需要发送JSON数据,那么前端需要调整Content-Type为application/json,并正确序列化数据。 另外,可能需要检查后端控制器的参数绑定方式,使用@ModelAttribute或者直接使用对象参数来接收表单数据。同时,检查是否有任何过滤器或拦截器在请求到达控制器之前拦截了请求,导致无法触发断点。 最后,建议用户逐步排查,从最简单的修改开始,比如先移除@RequestBody,添加依赖,然后测试,逐步定位问题所在。同时,查看日志中的详细错误信息,可能会有更具体的线索。</think>### 解决方案:415 Unsupported Media Type错误(No Body)的根本原因与修复步骤 #### 一、问题分析 该错误的核心是**客户端请求的Content-Type与服务器端支持的媒体类型不匹配**。结合引用[1][^1]和引用[3][^3],常见原因包括: 1. 前端使用`application/x-www-form-urlencoded`格式发送数据,但后端使用`@RequestBody`接收(默认需要`application/json`) 2. 缺少JSON序列化依赖(如`jackson-databind`) 3. 未正确声明支持的媒体类型 #### 二、分步解决方案 ##### 1. 修复Content-Type与参数绑定方式 - **前端代码调整**:确保Ajax请求明确声明Content-Type ```javascript // 示例:jQuery请求头设置 $.ajax({ type: "POST", url: "/your-endpoint", contentType: "application/x-www-form-urlencoded; charset=UTF-8", data: "name=value&age=25" }); ``` - **后端代码调整**:移除`@RequestBody`注解,改用直接参数绑定 ```java @PostMapping("/endpoint") public ResponseEntity<?> handleRequest(YourDTO dto) { // 直接通过对象接收参数 // 处理逻辑 } ``` ##### 2. 添加JSON处理依赖(若需支持JSON) 若必须使用`@RequestBody`接收JSON数据,则: - **步骤1**:添加Jackson依赖(引用[3][^3]) ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> ``` - **步骤2**:调整请求为JSON格式 ```javascript contentType: "application/json", data: JSON.stringify({ name: "value", age: 25 }) ``` ##### 3. 声明支持媒体类型(可选) 在Controller中明确指定consumes: ```java @PostMapping(value = "/endpoint", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) ``` #### 三、调试建议 1. 使用Postman模拟请求,验证是否是客户端配置问题 2. 检查Spring Boot启动日志,确认已注册`FormHttpMessageConverter` 3. 在`WebMvcConfigurer`中显式配置消息转换器: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new FormHttpMessageConverter()); converters.add(new MappingJackson2HttpMessageConverter()); } } ``` #### 四、典型错误场景对照表 | 现象 | 可能原因 | 解决方案 | |------|--------|---------| | 无法进入断点 | 请求在进入Controller前被拦截 | 检查过滤器链(如CORS配置)| | 空请求体 | 客户端未正确序列化数据 | 使用浏览器开发者工具检查请求负载 | | 日志出现`Content type 'application/x-www-form-urlencoded' not supported` | 参数绑定方式错误 | 移除@RequestBody注解 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值