Guida a UriComponentsBuilder in primavera

1. Introduzione

In questo tutorial, ci concentreremo su Spring UriComponentsBuilder. Più specificamente, descriveremo vari esempi pratici di implementazione.

Il builder funziona insieme alla classe UriComponents , un contenitore immutabile per i componenti URI.

Una nuova classe UriComponentsBuilder aiuta a creare istanze di UriComponents fornendo un controllo dettagliato su tutti gli aspetti della preparazione di un URI, inclusa la costruzione, l'espansione dalle variabili del modello e la codifica.

2. Dipendenze di Maven

Per poter utilizzare il builder, dobbiamo includere la seguente sezione nelle dipendenze del nostro pom.xml :

 org.springframework spring-web 5.2.2.RELEASE  

L'ultima versione può essere trovata qui.

Questa dipendenza copre solo Spring Web, quindi non dimenticare di aggiungere spring-context per un'applicazione web completa.

Ovviamente dobbiamo anche impostare la registrazione per il progetto - di più su questo qui.

3. Casi d'uso

Esistono molti casi d'uso pratici per UriComponentsBuilder , a partire da una codifica contestuale di caratteri non consentita nel componente URI corrispondente, finendo per sostituire dinamicamente parti dell'URL.

Uno dei maggiori vantaggi di UriComponentsBuilder è che possiamo iniettarlo direttamente in un metodo controller :

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

Cominciamo descrivendo esempi utili uno per uno. Useremo il framework JUnit per testare immediatamente le nostre implementazioni.

3.1. Costruire un URI

Cominciamo con quello più semplice. Vogliamo usare UriComponentsBuilder solo per creare un semplice collegamento:

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

Come possiamo osservare, abbiamo creato una nuova istanza di UriComponentsBuilder , quindi abbiamo fornito il tipo di schema, l'host e un percorso per la destinazione della richiesta.

Questo semplice esempio potrebbe essere utile quando vogliamo eseguire un reindirizzamento ad un'altra parte / collegamento del nostro sito web.

3.2. Costruire un URI codificato

Oltre a creare un semplice collegamento, potremmo voler codificare il risultato finale. Vediamolo in pratica:

@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 differenza in questo esempio è che vogliamo aggiungere uno spazio tra la parola junit e il numero 5 . Secondo la RFC 3986, non sarebbe possibile. Abbiamo bisogno di codificare il collegamento per ottenere un risultato valido, usando il metodo encode () .

3.3. Costruire un URI da un modello

I modelli URI sono consentiti nella maggior parte dei componenti di un URI ma il loro valore è limitato a un particolare elemento, che indichiamo come modello. Vediamo l'esempio per chiarire:

@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 differenza in questo esempio sta nel modo in cui dichiariamo il percorso e nel modo in cui costruiamo l'URI finale. Il modello che verrà sostituito dalle parole chiave è indicato tra parentesi - {…}, all'interno del metodo path () . La parola chiave utilizzata per generare il collegamento finale viene utilizzata nel metodo denominato buildAndExpand (…) .

Tieni presente che potrebbe esserci più di una parola chiave da sostituire. Inoltre, il percorso dell'URI può essere relativo.

Questo esempio sarà molto utile quando vorremmo passare oggetti del modello allo Spring Controller in base al quale costruiremo un URI.

3.4. Costruzione di un URI con parametri di query

Un altro caso molto utile è creare URI con parametri di query.

Dobbiamo usare query () da UriComponentsBuilder per specificare i parametri di query URI. Vediamo il seguente esempio:

@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 query verrà aggiunta alla parte principale del collegamento. Possiamo fornire più parametri di query, utilizzando le parentesi {…}. Verranno sostituiti da parole chiave nel metodo denominato buildAndExpand (…) .

Questa implementazione di UriComponentsBuilder potrebbe essere utilizzata per creare, ad esempio, un linguaggio di query per un'API REST.

3.5. Espansione di un URI con espressioni regolari

L'ultimo esempio mostra una costruzione di un URI con convalida di regex. Saremo in grado di espandere gli uriComponents solo se la convalida dell'espressione regolare avrà successo:

@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()); }

Nell'esempio sopra menzionato, possiamo vedere che la parte centrale del collegamento deve contenere solo lettere da az e la lunghezza in un intervallo tra 1-5 .

Inoltre, stiamo usando singletonMap , per sostituire il nome della parola chiave con il test del valore .

Questo esempio è particolarmente utile quando abilitiamo un utente a specificare i collegamenti dinamicamente, ma vogliamo fornire una sorta di sicurezza in cui solo i collegamenti validi funzionano nella nostra applicazione web.

4. Conclusione

Questo tutorial presenta esempi utili di UriComponentsBuilder .

I principali vantaggi di UriComponentsBuilder sono la flessibilità nell'utilizzo delle variabili del modello URI e la possibilità di iniettarlo direttamente nei metodi di Spring Controller.

Tutti gli esempi e le configurazioni sono disponibili qui su GitHub.