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