@RequestMapping注解中produces和consumes属性

2023-12-26 17:34:08

1.http协议基础知识

首先需要了解什么叫MediaType(媒体类型)?

通俗来说,在http协议中,用来表示传输内容的格式就是MediaType,比如text/html,application/json等,其中text代表介质,html代表格式

也就是经过http协议通信的双方,比如客户端和浏览器,要彼此告诉对方自己发送的内容是什么格式,期望获取的结果是什么格式

这两个功能是通过http header中的Content-Type头部和Accept头部来体现的

2.@RequestMapping对这两个头部的使用

而在springmvc @RequestMapping注解,其提供了根据MediaType进行过滤的功能,仅当Content-Type或Accept头部带有某些MediaType的时候,其才会进行映射

3.produces()属性

其功能有两个

功能1:当请求头中Accept的value与produces()配置的属性匹配上,则进行映射,否则返回客户端HTTP 406(Not Acceptable)响应,或415 unsupported mediaType

功能2:默认会把produces中配置的内容写到响应头的Content-Type中去

使用postman进行举例
20201016154010935

例1:当不配置produces()属性的时候,会根据Accept请求头来输出响应头的Content-Type

例2:当配置produces()属性的时候,需要Accept与配置的属性兼容,否则会抛出406或415异常

例3:当配置produces()属性的时候,如果未设置Accept请求头,那么默认就是*/*,会根据produces属性来输出响应头的Content-Type

4.consumes()属性

consumes属性的工作方式类似于produces,不过它会关注请求的ContentType头部信息。当请求头中Content-Type的value与consumes()配置的属性匹配上,则进行映射,否则415 unsupported mediaType

5.源码

// 通过Accept请求头 获取对端希望服务端返回的媒体类型
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
 
// 获取可生产的媒体类型
Set<MediaType> mediaTypes = (Set<MediaType>) request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
 
// 之后判断是否兼容 如果兼容 则返回兼容的媒体类型
 
// 如果不兼容
if (mediaTypesToUse.isEmpty()) {
    if (outputValue != null) {
        throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes);
    }
    return;
}
 

oducibleMediaTypes);
}
return;
}


文章来源:https://blog.csdn.net/weixin_44364444/article/details/135226382
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。