springmvc @RequestMapping注解中produces以及consumes属性的含义(转载请删除括号里的内容)

http协议基础知识

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

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

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

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

@RequestMapping对这两个头部的使用

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

produces()属性

其功能有两个

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

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

使用postman进行举例

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

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

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

consumes()属性

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

源码

这块内容属于springmvc 内容协商部分

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters

// 通过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;
}

猜你喜欢

转载自blog.csdn.net/qq_43985303/article/details/131811696