Objektlisten mit RestTemplate abrufen und veröffentlichen

Abrufen und Bereitstellen von Objektlisten mit RestTemplate

1. Einführung

Die KlasseRestTemplate ist das zentrale Tool für die Ausführung clientseitiger HTTP-Operationen in Spring. Es bietet verschiedene Dienstprogrammmethoden zum Erstellen von HTTP-Anforderungen und zum Behandeln von Antworten.

Und daRestTemplate gut inJackson, integriert ist, können die meisten Objekte ohne großen Aufwand zu und von JSON serialisiert / deserialisiert werden. working with collections of objects is not so straightforward.

In diesem Tutorial erfahren Sie, wie SieRestTemplate fürGET undPOST für eine Liste von Objekten verwenden.

Weitere Lektüre:

Fehlerbehandlung für Spring RestTemplate

Erfahren Sie, wie Sie mit Spring's RestTemplate mit Fehlern umgehen

Read more

RestTemplate Post Request mit JSON

Erfahren Sie, wie Sie mit RestTemplate von Spring Anforderungen mit JSON-Inhalten senden.

Read more

2. Beispielservice

Wir werden eine Mitarbeiter-API mit zwei HTTP-Endpunkten verwenden - alle abrufen und erstellen:

  • 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, derRestTemplate verwendet, um Listen vonEmployee-Objekten abzurufen und zu erstellen.

3. Holen Sie sich eine Liste der Objekte mitRestTemplate

Normalerweise können Sie beim Aufrufen von GET eine der vereinfachten Methoden inRestTemplate verwenden, z. B.:

getForObject (URI-URL, Antworttyp der Klasse )

Dies sendet eine Anforderung an den angegebenen URI unter Verwendung des Verbs GET und konvertiert den Antworttext in den angeforderten Java-Typ. Dies funktioniert für die meisten Klassen hervorragend, hat jedoch eine Einschränkung:we cannot send lists of objects.

Das Problem ist auf die Typlöschung bei Java-Generika zurückzuführen. Wenn die Anwendung ausgeführt wird, weiß sie nicht, welcher Objekttyp in der Liste enthalten ist. This means the data in the list cannot be deserialized into the appropriate type.

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

3.1. Arrays verwenden

Erstens können wirRestTemplate.getForObject() verwenden, um ein Array von Objekten über den ParameterresponseType abzurufen. Unabhängig davon, welcheclass wir dort angeben, entspricht sie dem Parametertyp vonResponseEntity:

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

Außerdem hätten wirRestTemplate.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 weitere Anpassungen benötigen, können wirexecute 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 mit dieser Situation umzugehen, 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 einfacheregetForObject()-Methode verwenden, um die Liste der Mitarbeiter zu erhalten:

EmployeeList response = restTemplate.getForObject(
  "http://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 mitRestTemplate

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

postForObject (URI-URL, Objektanforderung, Antworttyp der Klasse )

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 istwe don’t have to worry about type erasure.

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(
  "http://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 mitRestTemplate senden:

List newEmployees = new ArrayList<>();
newEmployees.add(new Employee(3, "Intern"));
newEmployees.add(new Employee(4, "CEO"));

restTemplate.postForObject(
  "http://localhost:8080/employees",
  new EmployeeList(newEmployees),
  ResponseEntity.class);

5. Fazit

Mit RestTemplate können Sie auf einfache Weise HTTP-Clients für die Kommunikation mit Ihren Diensten erstellen.

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 damit problemlos mit Objektlisten arbeiten.

Wie üblich ist der vollständige Code inGithub project verfügbar.