Guide d'UriComponentsBuilder au printemps

1. Introduction

Dans ce tutoriel, nous allons nous concentrer sur le Spring UriComponentsBuilder. Plus précisément, nous décrirons divers exemples pratiques de mise en œuvre.

Le générateur fonctionne en conjonction avec la classe UriComponents - un conteneur immuable pour les composants URI.

Une nouvelle classe UriComponentsBuilder aide à créer des instances UriComponents en fournissant un contrôle précis sur tous les aspects de la préparation d'un URI, y compris la construction, l'expansion à partir de variables de modèle et l'encodage.

2. Dépendances de Maven

Pour utiliser le générateur, nous devons inclure la section suivante dans les dépendances de notre pom.xml :

 org.springframework spring-web 5.2.2.RELEASE  

La dernière version peut être trouvée ici.

Cette dépendance ne couvre que Spring Web, alors n'oubliez pas d'ajouter spring-context pour une application Web complète.

Nous devons bien sûr également configurer la journalisation pour le projet - plus d'informations à ce sujet ici.

3. Cas d'utilisation

Il existe de nombreux cas d'utilisation pratiques pour UriComponentsBuilder , en partant d'un encodage contextuel de caractères non autorisés dans le composant URI correspondant, en terminant par le remplacement dynamique de parties de l'URL.

L'un des plus grands avantages d' UriComponentsBuilder est que nous pouvons l'injecter directement dans une méthode de contrôleur :

@RequestMapping(method = RequestMethod.POST) public ResponseEntity createCustomer(UriComponentsBuilder builder) { // implementation }

Commençons par décrire les exemples utiles un par un. Nous utiliserons le framework JUnit pour tester immédiatement nos implémentations.

3.1. Construire un URI

Commençons par le plus simple. Nous voulons utiliser UriComponentsBuilder juste pour créer un lien simple:

@Test public void constructUri() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/junit-5").build(); assertEquals("/junit-5", uriComponents.toUriString()); }

Comme nous pouvons l'observer, nous avons créé une nouvelle instance de UriComponentsBuilder , puis nous avons fourni le type de schéma, l'hôte et un chemin vers la destination de la requête.

Cet exemple simple peut être utile lorsque nous voulons effectuer une redirection vers une autre partie / lien de notre site Web.

3.2. Construire un URI encodé

En plus de créer un lien simple, nous pouvons vouloir encoder le résultat final. Voyons cela en pratique:

@Test public void constructUriEncoded() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/junit 5").build().encode(); assertEquals("/junit%205", uriComponents.toUriString()); }

La différence dans cet exemple est que nous voulons ajouter un espace entre le mot junit et le numéro 5 . Conformément à la RFC 3986, cela ne serait pas possible. Nous devons encoder le lien pour obtenir le résultat valide, en utilisant la méthode encode () .

3.3. Construire un URI à partir d'un modèle

Les modèles d'URI sont autorisés dans la plupart des composants d'un URI mais leur valeur est limitée à un élément particulier, que nous indiquons comme modèle. Voyons l'exemple pour clarifier:

@Test public void constructUriFromTemplate() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.baeldung.com").path("/{article-name}") .buildAndExpand("junit-5"); assertEquals("/junit-5", uriComponents.toUriString()); }

La différence dans cet exemple réside dans la façon dont nous déclarons le chemin et comment nous construisons l'URI final. Le modèle qui sera remplacé par des mots-clés est indiqué par des crochets - {…}, à l'intérieur de la méthode path () . Le mot-clé utilisé pour générer le lien final est utilisé dans la méthode nommée buildAndExpand (…) .

Veuillez noter qu'il peut y avoir plus d'un mot clé à remplacer. En outre, le chemin d'accès à l'URI peut être relatif.

Cet exemple sera très utile lorsque nous souhaitons transmettre des objets de modèle au Spring Controller sur la base desquels nous créerons un URI.

3.4. Construction d'un URI avec des paramètres de requête

Un autre cas très utile est de créer un URI avec des paramètres de requête.

Nous devons utiliser query () de UriComponentsBuilder pour spécifier les paramètres de requête URI. Voyons l'exemple suivant:

@Test public void constructUriWithQueryParameter() { UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("http").host("www.google.com") .path("/").query("q={keyword}").buildAndExpand("baeldung"); assertEquals("//www.google.com/?q=baeldung", uriComponents.toUriString()); }

La requête sera ajoutée à la partie principale du lien. Nous pouvons fournir plusieurs paramètres de requête, en utilisant des crochets {…}. Ils seront remplacés par des mots-clés dans la méthode nommée buildAndExpand (…) .

Cette implémentation d' UriComponentsBuilder peut être utilisée pour créer, par exemple, un langage de requête pour une API REST.

3.5. Extension d'un URI avec des expressions régulières

Le dernier exemple montre une construction d'un URI avec une validation regex. Nous ne pourrons étendre les uriComponents que si la validation regex réussit:

@Test public void expandWithRegexVar() { String template = "/myurl/{name:[a-z]{1,5}}/show"; UriComponents uriComponents = UriComponentsBuilder.fromUriString(template) .build(); uriComponents = uriComponents.expand(Collections.singletonMap("name", "test")); assertEquals("/myurl/test/show", uriComponents.getPath()); }

Dans l'exemple mentionné ci-dessus, nous pouvons voir que la partie médiane du lien ne doit avoir que des lettres de az et la longueur dans une plage comprise entre 1 et 5 .

De plus, nous utilisons singletonMap , pour remplacer le nom du mot-clé par un test de valeur .

Cet exemple est particulièrement utile lorsque nous permettons à un utilisateur de spécifier des liens de manière dynamique, mais que nous souhaitons fournir une sorte de sécurité où seuls les liens valides fonctionnent dans notre application Web.

4. Conclusion

Ce didacticiel présente des exemples utiles de UriComponentsBuilder .

Les principaux avantages d' UriComponentsBuilder sont la flexibilité d'utilisation des variables de modèle d'URI et la possibilité de l'injecter directement dans les méthodes Spring Controller.

Tous les exemples et configurations sont disponibles ici sur GitHub.