La signification des attributs de production et de consommation dans l'annotation springmvc @RequestMapping (veuillez supprimer le contenu entre parenthèses pour réimpression)

Connaissance de base du protocole http

Tout d'abord, vous devez comprendre ce qu'est MediaType (type de média) ?

De manière générale, dans le protocole http, le format utilisé pour représenter le contenu de transmission est MediaType, tel que text/html, application/json, etc., où text représente le support et html représente le format

Autrement dit, les deux parties qui communiquent via le protocole http, telles que le client et le navigateur, doivent se dire quel format le contenu qu'elles envoient est et quel format le résultat devrait être obtenu

Ces deux fonctions sont reflétées par l'en-tête Content-Type et l'en-tête Accept dans l' en-tête http

Utilisation par @RequestMapping de ces deux en-têtes

Dans l'annotation springmvc @RequestMapping, il fournit la fonction de filtrage en fonction de MediaType, et seulement lorsque l'en-tête Content-Type ou Accept a un certain MediaType, il mappera

propriété produit ()

Sa fonction a deux

Fonction 1 : Lorsque la valeur de Accept dans l'en-tête de la requête correspond à l'attribut configuré par Produces(), mappez-le, sinon renvoyez la réponse HTTP 406 (non acceptable) du client ou 415 mediaType non pris en charge

Fonction 2 : Par défaut, le contenu configuré dans produit sera écrit dans le Content-Type de l'en-tête de réponse

Utilisez le facteur comme exemple

Exemple 1 : Lorsque l'attribut Produces() n'est pas configuré, le Content-Type de l'en-tête de réponse sera généré conformément à l'en-tête de requête Accept.

Exemple 2 : Lors de la configuration de l'attribut Produces(), Accept doit être compatible avec l'attribut configuré, sinon une exception 406 ou 415 sera levée

Exemple 3 : lors de la configuration de l'attribut Produces(), si l'en-tête de requête Accept n'est pas défini, la valeur par défaut est */* et le type de contenu de l'en-tête de réponse sera généré en fonction de l'attribut Produces.

attribut consomme()

L'attribut consomme fonctionne de la même manière que produit, mais il prend en charge l'en-tête ContentType de la requête. Lorsque la valeur de Content-Type dans l'en-tête de la requête correspond à l'attribut configuré par consomme(), le mappage est effectué, sinon 415 mediaType non pris en charge

code source

Cet élément de contenu appartient à la partie négociation de contenu 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;
}

Guess you like

Origin blog.csdn.net/qq_43985303/article/details/131811696