El significado de los atributos produce y consume en la anotación springmvc @RequestMapping (elimine el contenido entre paréntesis para reimprimirlo)

Conocimientos básicos del protocolo http

En primer lugar, debe comprender qué es MediaType (tipo de medio)?

En términos generales, en el protocolo http, el formato utilizado para representar el contenido de la transmisión es MediaType, como texto/html, aplicación/json, etc., donde texto representa el medio y html representa el formato.

Es decir, las dos partes que se comunican a través del protocolo http, como son el cliente y el navegador, necesitan decirse en qué formato es el contenido que envían y en qué formato se espera obtener el resultado.

Estas dos funciones se reflejan en el encabezado de tipo de contenido y en el encabezado de aceptación en el encabezado http.

El uso de @RequestMapping de estos dos encabezados

En la anotación springmvc @RequestMapping, proporciona la función de filtrado según MediaType, y solo cuando el encabezado Content-Type o Accept tiene cierto MediaType, se asignará

produce() propiedad

Su función tiene dos

Función 1: cuando el valor de Aceptar en el encabezado de la solicitud coincide con el atributo configurado por produce(), mapéelo; de lo contrario, devuelva la respuesta HTTP 406 (no aceptable) del cliente o 415 tipo de medio no compatible

Función 2: De forma predeterminada, el contenido configurado en produce se escribirá en el tipo de contenido del encabezado de respuesta.

Utilice cartero como un ejemplo

Ejemplo 1: cuando el atributo produce () no está configurado, el tipo de contenido del encabezado de respuesta se generará de acuerdo con el encabezado de solicitud de aceptación

Ejemplo 2: al configurar el atributo produce(), Accept debe ser compatible con el atributo configurado; de lo contrario, se generará una excepción 406 o 415

Ejemplo 3: al configurar el atributo produce(), si el encabezado de solicitud de aceptación no está establecido, entonces el valor predeterminado es */*, y el tipo de contenido del encabezado de respuesta se generará de acuerdo con el atributo produce

atributo consume()

El atributo consume funciona de manera similar a produce, pero se encarga del encabezado ContentType de la solicitud. Cuando el valor de Content-Type en el encabezado de la solicitud coincide con el atributo configurado por consume(), se realiza la asignación; de lo contrario, 415 tipo de medio no compatible

código fuente

Este contenido pertenece a la parte de negociación de contenido de 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43985303/article/details/131811696
Recomendado
Clasificación