前言:
我在用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,看看会出现什么问题?
请求参数:
请求Content-Type的格式:
controller的方法的截图:
这时候我的Content-Type设置的是text/plain,而方法上consumes设置的却是application/json,结果调用接口就会出现415。
postman异常截图如下:
控制台异常截图:
结果很明显,如果我对入参的数据类型进行限制,你没有按照接口要去来,就会调不通接口,并返回415,数据类型不支持的错误。
②前端请求Content-Type(请求参数的数据格式):application/json,Accept(希望得到的数据类型):text/plain,后台设置的produces(返回的内容类型)却是application/json,看看会出现什么问题?
请求参数:
请求Content-Type的格式和Accept的格式:
controller的方法的截图:
控制台异常截图:
这里出现的异常就是文章开始提到的异常,所以如果你的Accept的数据类型进行了限制,而返回数据类型也不符合,就会出现这个错误。
总结:
我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有六位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里不明白或有不同观点的地方欢迎留言。