前言:

我在用postman测试的接口时,碰到一个异常Spring Boot: HttpMediaTypeNotAcceptableException: Could not find acceptable representation,Could not find acceptable representation意思就是找不到可接受的表示形式,根据这个意思我推测是否是postman请求头里的设置的Content-Type和我方法设置的入参的数据格式发生了冲突,沿着这个思路我就对consumes = "application/json"这个属性展开测试,最终问题也定位到这里,这篇文章就讲解下@RequestMapping属性中consumes、produces的使用,并解释这个异常出现的原因。

正文:

1.先简单介绍下请求报文头里的几个属性。

Accept代表发送端(客户端)希望接受的数据类型。 
比如:Accept:text/xml; 
代表客户端希望接受的数据类型是xml类型

Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。 
比如:Content-Type:text/html; 
代表发送端发送的数据格式是html。

二者合起来, 
Accept:text/xml; 
Content-Type:text/html 
即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。

上面的解释来博客:https://blog.csdn.net/muzizongheng/article/details/46795243

2.然后介绍下@RequestMapping属性中consumes、produces的作用

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

3.为什么使用consumes、produces者两个属性?

答:可以针对请求方数据类型来进行访问的控制和过滤。

4.举两个例子

①前端请求Content-Type(请求参数的数据格式):text/plain,后台设置的consumes(控制入参的数据类型)却是application/json,看看会出现什么问题?

请求参数:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_计算机基础知识

请求Content-Type的格式:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_计算机基础知识_02

controller的方法的截图:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_经验分享_03

这时候我的Content-Type设置的是text/plain,而方法上consumes设置的却是application/json,结果调用接口就会出现415。

postman异常截图如下:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_经验分享_04

控制台异常截图:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_经验分享_05

结果很明显,如果我对入参的数据类型进行限制,你没有按照接口要去来,就会调不通接口,并返回415,数据类型不支持的错误。

②前端请求Content-Type(请求参数的数据格式):application/json,Accept(希望得到的数据类型):text/plain,后台设置的produces(返回的内容类型)却是application/json,看看会出现什么问题?

请求参数:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_计算机基础知识

请求Content-Type的格式和Accept的格式:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_计算机基础知识_07

controller的方法的截图:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_经验分享_08

控制台异常截图:

Spring MVC之@RequestMapping属性中consumes、produces的使用讲解。_经验分享_09

这里出现的异常就是文章开始提到的异常,所以如果你的Accept的数据类型进行了限制,而返回数据类型也不符合,就会出现这个错误。

总结:

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有六位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里不明白或有不同观点的地方欢迎留言。