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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值