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