Négociation de contenu Spring MVC

1. Vue d'ensemble

Cet article décrit comment implémenter la négociation de contenu dans un projet Spring MVC.

En règle générale, il existe trois options pour déterminer le type de média d'une demande:

  • Utilisation de suffixes d'URL (extensions) dans la requête (par exemple .xml / .json )
  • Utilisation du paramètre URL dans la requête (par exemple ? Format = json )
  • Utilisation de l'en- tête Accept dans la demande

Par défaut, c'est l'ordre dans lequel le gestionnaire de négociation de contenu Spring essaiera d'utiliser ces trois stratégies. Et si aucun de ceux-ci n'est activé, nous pouvons spécifier un retour vers un type de contenu par défaut.

2. Stratégies de négociation de contenu

Commençons par les dépendances nécessaires - nous travaillons avec des représentations JSON et XML, donc pour cet article, nous utiliserons Jackson pour JSON:

 com.fasterxml.jackson.core jackson-core 2.10.2   com.fasterxml.jackson.core jackson-databind 2.10.2  

Pour le support XML, nous pouvons utiliser JAXB, XStream ou le nouveau support Jackson-XML.

Puisque nous avons expliqué l'utilisation de l'en- tête Accept dans un article précédent sur HttpMessageConverters, concentrons-nous sur les deux premières stratégies en profondeur.

3. La stratégie de suffixe d'URL

Par défaut, cette stratégie est désactivée, mais le framework peut rechercher une extension de chemin directement à partir de l'URL pour déterminer le type de contenu de sortie.

Avant d'entrer dans les configurations, jetons un coup d'œil rapide à un exemple. Nous avons l'implémentation de méthode API simple suivante dans un contrôleur Spring typique:

@RequestMapping( value = "/employee/{id}", produces = { "application/json", "application/xml" }, method = RequestMethod.GET) public @ResponseBody Employee getEmployeeById(@PathVariable long id) { return employeeMap.get(id); } 

Appelons-le en utilisant l'extension JSON pour spécifier le type de média de la ressource:

curl //localhost:8080/spring-mvc-basics/employee/10.json

Voici ce que nous pourrions obtenir si nous utilisons une extension JSON:

{ "id": 10, "name": "Test Employee", "contactNumber": "999-999-9999" }

Et voici à quoi ressemblera la requête-réponse avec XML:

curl //localhost:8080/spring-mvc-basics/employee/10.xml

Le corps de la réponse:

 999-999-9999 10 Test Employee 

Maintenant, si nous n'utilisons aucune extension ou si nous en utilisons une qui n'est pas configurée, le type de contenu par défaut sera retourné:

curl //localhost:8080/spring-mvc-basics/employee/10

Jetons maintenant un œil à la mise en place de cette stratégie - avec des configurations Java et XML.

3.1. Configuration Java

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(true). favorParameter(false). ignoreAcceptHeader(true). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON); }

Passons en revue les détails.

Tout d'abord, nous activons la stratégie d'extensions de chemin. Il convient également de mentionner que depuis Spring Framework 5.2.4, la méthode favorPathExtension (booléenne) est obsolète afin de décourager l'utilisation d'extensions de chemin pour les négociations de contenu.

Ensuite, nous désactivons la stratégie de paramètre d'URL ainsi que la stratégie d'en-tête Accept - car nous voulons uniquement nous fier à la méthode d'extension de chemin pour déterminer le type de contenu.

Nous désactivons ensuite le Java Activation Framework; JAF peut être utilisé comme mécanisme de secours pour sélectionner le format de sortie si la demande entrante ne correspond à aucune des stratégies que nous avons configurées. Nous le désactivons car nous allons configurer JSON comme type de contenu par défaut. Veuillez noter que la méthode useJaf () est obsolète à partir de Spring Framework 5 .

Et enfin - nous configurons JSON pour être la valeur par défaut. Cela signifie que si aucune des deux stratégies ne correspond, toutes les demandes entrantes seront mappées à une méthode de contrôleur qui sert JSON.

3.2. Configuration XML

Jetons également un coup d'œil à la même configuration exacte, en utilisant uniquement XML:

4. La stratégie de paramètre d'URL

Nous avons utilisé des extensions de chemin dans la section précédente - configurons maintenant Spring MVC pour utiliser un paramètre de chemin.

Nous pouvons activer cette stratégie en définissant la valeur de la propriété favorParameter sur true.

Voyons rapidement comment cela fonctionnerait avec notre exemple précédent:

curl //localhost:8080/spring-mvc-basics/employee/10?mediaType=json

Et voici ce que sera le corps de la réponse JSON:

{ "id": 10, "name": "Test Employee", "contactNumber": "999-999-9999" }

Si nous utilisons le paramètre XML, la sortie sera au format XML:

curl //localhost:8080/spring-mvc-basics/employee/10?mediaType=xml

Le corps de la réponse:

 999-999-9999 10 Test Employee 

Maintenant, faisons la configuration - encore une fois, en utilisant d'abord Java, puis XML.

4.1. Configuration Java

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false). favorParameter(true). parameterName("mediaType"). ignoreAcceptHeader(true). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON). mediaType("xml", MediaType.APPLICATION_XML). mediaType("json", MediaType.APPLICATION_JSON); } 

Lisons cette configuration.

Tout d'abord, bien sûr, l'extension de chemin et les stratégies d'en-tête Accept sont désactivées (ainsi que JAF).

Le reste de la configuration est le même.

4.2. Configuration XML

De plus, nous pouvons avoir les deux stratégies (extension et paramètre) activées en même temps:

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(true). favorParameter(true). parameterName("mediaType"). ignoreAcceptHeader(true). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON). mediaType("xml", MediaType.APPLICATION_XML). mediaType("json", MediaType.APPLICATION_JSON); }

Dans ce cas, Spring cherchera d'abord l'extension de chemin, si cela n'est pas présent, il recherchera le paramètre de chemin. Et si les deux ne sont pas disponibles dans la demande d'entrée, le type de contenu par défaut sera renvoyé.

5. La stratégie d'en-tête Accepter

Si l'en- tête Accept est activé, Spring MVC recherchera sa valeur dans la demande entrante pour déterminer le type de représentation.

Nous devons définir la valeur de ignoreAcceptHeader sur false pour activer cette approche et nous désactivons les deux autres stratégies juste pour que nous sachions que nous ne comptons que sur l'en- tête Accept .

5.1. Configuration Java

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(true). favorParameter(false). parameterName("mediaType"). ignoreAcceptHeader(false). useJaf(false). defaultContentType(MediaType.APPLICATION_JSON). mediaType("xml", MediaType.APPLICATION_XML). mediaType("json", MediaType.APPLICATION_JSON); }

5.2. Configuration XML

Enfin, nous devons activer le gestionnaire de négociation de contenu en le plug-in dans la configuration globale:

6. Conclusion

Et nous avons terminé. Nous avons examiné le fonctionnement de la négociation de contenu dans Spring MVC et nous nous sommes concentrés sur quelques exemples de configuration pour utiliser diverses stratégies pour déterminer le type de contenu.

La mise en œuvre complète de cet article est disponible à l'adresse over sur GitHub.