Abrufen und Veröffentlichen von Objektlisten mit RestTemplate

1. Einleitung

Die RestTemplate- Klasse ist das zentrale Tool zum Ausführen clientseitiger HTTP-Vorgänge in Spring. Es bietet verschiedene Dienstprogrammmethoden zum Erstellen von HTTP-Anforderungen und zum Behandeln von Antworten.

Und da RestTemplate gut in Jackson integriert ist, kann es die meisten Objekte ohne großen Aufwand zu und von JSON serialisieren / deserialisieren. Das Arbeiten mit Sammlungen von Objekten ist jedoch nicht so einfach .

In diesem Tutorial werden wir sehen , wie die Verwendung RestTemplate sowohl GET und POST eine Liste von Objekten.

2. Beispielservice

Wir werden eine Mitarbeiter-API verwenden, die zwei HTTP-Endpunkte hat - holen Sie sich alles und erstellen Sie:

  • GET / Mitarbeiter
  • POST / Mitarbeiter

Für die Kommunikation zwischen Client und Server verwenden wir ein einfaches DTO, um grundlegende Mitarbeiterdaten zu kapseln:

public class Employee { public long id; public String title; // standard constructor and setters/getters }

Wir sind jetzt bereit, Code zu schreiben, der RestTemplate verwendet , um Listen von Mitarbeiterobjekten abzurufen und zu erstellen .

3. Holen Sie sich mit RestTemplate eine Liste der Objekte

Normalerweise , wenn GET aufrufen, können Sie eine der vereinfachten Methoden verwenden RestTemplate , wie :

getForObject (URI-URL, Klasse responseType)

Dadurch wird eine Anforderung mit dem Verb GET an den angegebenen URI gesendet und der Antworttext in den angeforderten Java-Typ konvertiert. Dies funktioniert für die meisten Klassen hervorragend, hat jedoch eine Einschränkung: Wir können keine Objektlisten senden.

Das Problem ist auf das Löschen von Typen mit Java-Generika zurückzuführen. Wenn die Anwendung ausgeführt wird, weiß sie nicht, welcher Objekttyp in der Liste enthalten ist. Dies bedeutet, dass die Daten in der Liste nicht in den entsprechenden Typ deserialisiert werden können.

Zum Glück haben wir zwei Möglichkeiten, dies zu umgehen.

3.1. Arrays verwenden

Erstens können wir RestTemplate verwenden. getForEntity (), um ein Array von Objekten über den Parameter responseType abzurufen . Welche Klasse wir dort angeben , entspricht dem Parametertyp von ResponseEntity :

ResponseEntity response = restTemplate.getForEntity( "//localhost:8080/employees/", Employee[].class); Employee[] employees = response.getBody();

Außerdem hätten wir RestTemplate.exchange verwenden können , um das gleiche Ergebnis zu erzielen.

Beachten Sie, dass der Mitarbeiter, der hier das schwere Heben ausführt, ResponseExtractor ist. Wenn wir also weitere Anpassungen benötigen, können wir execute aufrufen und unsere eigene Instanz bereitstellen.

3.2. Verwenden einer Wrapper-Klasse

Einige APIs geben ein Objekt der obersten Ebene zurück, das die Liste der Mitarbeiter enthält, anstatt die Liste direkt zurückzugeben. Um diese Situation zu bewältigen, können wir eine Wrapper-Klasse verwenden, die die Liste der Mitarbeiter enthält.

public class EmployeeList { private List employees; public EmployeeList() { employees = new ArrayList(); } // standard constructor and getter/setter }

Jetzt können wir die einfachere Methode getForObject () verwenden, um die Liste der Mitarbeiter abzurufen :

EmployeeList response = restTemplate.getForObject( "//localhost:8080/employees", EmployeeList.class); List employees = response.getEmployees();

Dieser Code ist viel einfacher, erfordert jedoch ein zusätzliches Wrapper-Objekt.

4. Veröffentlichen Sie eine Liste von Objekten mit RestTemplate

Schauen wir uns nun an, wie Sie eine Liste von Objekten von unserem Client an den Server senden. Genau wie oben bietet RestTemplate eine vereinfachte Methode zum Aufrufen von POST:

postForObject (URI-URL, Objektanforderung, Klasse responseType)

Dadurch wird ein HTTP-POST mit dem optionalen Anforderungshauptteil an den angegebenen URI gesendet und die Antwort in den angegebenen Typ konvertiert. Im Gegensatz zum obigen GET-Szenario müssen wir uns nicht um das Löschen von Typen kümmern .

Dies liegt daran, dass wir jetzt von Java-Objekten zu JSON wechseln. Die Liste der Objekte und ihr Typ sind der JVM bekannt und müssen daher ordnungsgemäß serialisiert werden:

List newEmployees = new ArrayList(); newEmployees.add(new Employee(3, "Intern")); newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( "//localhost:8080/employees/", newEmployees, ResponseEntity.class);

4.1. Verwenden einer Wrapper-Klasse

Wenn wir eine Wrapper-Klasse verwenden müssen, um mit dem obigen GET-Szenario übereinzustimmen, ist dies ebenfalls einfach. Wir können eine neue Liste mit RestTemplate senden :

List newEmployees = new ArrayList(); newEmployees.add(new Employee(3, "Intern")); newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( "//localhost:8080/employees", new EmployeeList(newEmployees), ResponseEntity.class);

5. Schlussfolgerung

Die Verwendung von RestTemplate ist eine einfache Methode zum Erstellen von HTTP-Clients für die Kommunikation mit Ihren Diensten.

Es bietet eine Reihe von Methoden für die Arbeit mit jeder HTTP-Methode und einfachen Objekten. Mit ein wenig zusätzlichem Code können wir ihn problemlos zum Arbeiten mit Objektlisten verwenden.

Der vollständige Code ist wie gewohnt im Github-Projekt verfügbar.