Leitfaden für UriComponentsBuilder im Frühling

Leitfaden für UriComponentsBuilder im Frühjahr

1. Einführung

In diesem Tutorial konzentrieren wir uns auf die SpringUriComponentsBuilder.. Insbesondere werden verschiedene praktische Implementierungsbeispiele beschrieben.

Der Builder arbeitet in Verbindung mit der KlasseUriComponents- einem unveränderlichen Container für URI-Komponenten.

Eine neueUriComponentsBuilder-Klasse hilft beim Erstellen vonUriComponents-Instanzen, indem sie eine detaillierte Kontrolle über alle Aspekte der Vorbereitung eines URI bietet, einschließlich Konstruktion, Erweiterung von Vorlagenvariablen und Codierung.

2. Maven-Abhängigkeiten

Um den Builder verwenden zu können, müssen wir den folgenden Abschnitt in diedependencies unsererpom.xml aufnehmen:


    org.springframework
    spring-web
    5.1.0.RELEASE

Die neueste Version finden Sie unterhere.

Diese Abhängigkeit gilt nur für Spring Web. Vergessen Sie also nicht,spring-context für eine vollständige Webanwendung hinzuzufügen.

Wir müssen natürlich auch die Protokollierung für das Projekt einrichten - mehr zuhere.

3. Anwendungsfälle

Es gibt viele praktische Anwendungsfälle fürUriComponentsBuilder, beginnend mit einer kontextbezogenen Codierung von Zeichen, die in der entsprechenden URI-Komponente nicht zulässig sind, bis hin zum dynamischen Ersetzen von Teilen der URL.

Einer der größten Vorteile vonUriComponentsBuilder ist, dasswe can inject it right into a controller method:

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

Beschreiben wir nacheinander nützliche Beispiele. Wir werden das JUnit-Framework verwenden, um unsere Implementierungen sofort zu testen.

3.1. URI erstellen

Beginnen wir mit dem einfachsten. Wir möchtenUriComponentsBuilder verwenden, um einen einfachen Link zu erstellen:

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

    assertEquals("/junit-5", uriComponents.toUriString());
}

Wie wir vielleicht beobachten, haben wir eine neue Instanz vonUriComponentsBuilder erstellt und dann den Schematyp, den Host und einen Pfad zum Anforderungsziel angegeben.

Dieses einfache Beispiel kann nützlich sein, wenn wir eine Weiterleitung zu einem anderen Teil / Link unserer Website durchführen möchten.

3.2. Erstellen eines codierten URI

Zusätzlich zum Erstellen eines einfachen Links möchten wir möglicherweise das Endergebnis codieren. Sehen wir uns das in der Praxis an:

@Test
public void constructUriEncoded() {
    UriComponents uriComponents = UriComponentsBuilder.newInstance()
      .scheme("http").host("www.example.com").path("/junit 5").build().encode();

    assertEquals("/junit%205", uriComponents.toUriString());
}

Der Unterschied in diesem Beispiel besteht darin, dass zwischen dem Wortjunit und der Zahl5 ein Leerzeichen eingefügt werden soll. Entsprechend denRFC 3986 wäre dies nicht möglich. Wir müssen den Link codieren, um das gültige Ergebnis mit der Methodeencode()zu erzielen.

3.3. Erstellen einer URI aus einer Vorlage

URI-Vorlagen sind in den meisten Komponenten einer URI zulässig, ihr Wert ist jedoch auf ein bestimmtes Element beschränkt, das wir als Vorlage angeben. Sehen wir uns das Beispiel an, um Folgendes zu verdeutlichen:

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

    assertEquals("/junit-5", uriComponents.toUriString());
}

Der Unterschied in diesem Beispiel besteht darin, wie wir den Pfad deklarieren und wie wir den endgültigen URI erstellen. Vorlagen, die durch Schlüsselwörter ersetzt werden, werden in Klammern -\{…}, innerhalb derpath()-Methode angegeben. Das Schlüsselwort, mit dem der endgültige Link generiert wird, wird in der MethodebuildAndExpand(…) verwendet.

Beachten Sie, dass möglicherweise mehrere Keywords ersetzt werden müssen. Der Pfad zur URI kann auch relativ sein.

Dieses Beispiel ist sehr hilfreich, wenn wir Modellobjekte an den Spring Controller übergeben möchten, auf dessen Grundlage wir einen URI erstellen.

3.4. Erstellen eines URI mit Abfrageparametern

Ein weiterer sehr nützlicher Fall ist das Erstellen eines URI mit Abfrageparametern.

Wir müssenquery() vonUriComponentsBuilder verwenden, um URI-Abfrageparameter anzugeben. Sehen wir uns das folgende Beispiel an:

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

     assertEquals("http://www.google.com/?q=example", uriComponents.toUriString());
}

Die Abfrage wird zum Hauptteil des Links hinzugefügt. Wir können mehrere Abfrageparameter in Klammern\{…}. bereitstellen. Sie werden in der MethodebuildAndExpand(…) durch Schlüsselwörter ersetzt.

Diese Implementierung vonUriComponentsBuilder kann verwendet werden, um beispielsweise eine Abfragesprache für eine REST-API zu erstellen.

3.5. Erweitern eines URI mit regulären Ausdrücken

Das letzte Beispiel zeigt eine Konstruktion eines URI mit Regex-Validierung. Wir können dieuriComponentsnur dann erweitern, wenn die Regex-Validierung erfolgreich ist:

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

Im oben genannten Beispiel können wir sehen, dass der mittlere Teil des Links nur Buchstaben vona-z und die Länge in einem Bereich zwischen1-5 enthalten muss.

Außerdem verwenden wirsingletonMap, um das Schlüsselwortname durch den Werttest zu ersetzen.

Dieses Beispiel ist besonders nützlich, wenn wir einem Benutzer ermöglichen, Links dynamisch anzugeben, aber eine Art Sicherheit bieten möchten, bei der nur gültige Links in unserer Webanwendung funktionieren.

4. Fazit

Dieses Tutorial enthält nützliche Beispiele fürUriComponentsBuilder.

Die Hauptvorteile vonUriComponentsBuilder sind die Flexibilität bei der Verwendung von URI-Vorlagenvariablen und die Möglichkeit, diese direkt in Spring Controller-Methoden einzufügen.

Alle Beispiele und Konfigurationen finden Sie hier aufGitHub.