«1. Введение

Класс RestTemplate является центральным инструментом для выполнения HTTP-операций на стороне клиента в Spring. Он предоставляет несколько служебных методов для создания HTTP-запросов и обработки ответов.

И, поскольку RestTemplate хорошо интегрируется с Jackson, он может без особых усилий сериализовать/десериализовать большинство объектов в JSON и обратно. Однако работать с коллекциями объектов не так просто.

В этом уроке мы увидим, как использовать RestTemplate для GET и POST списка объектов.

2. Пример службы

Мы будем использовать API сотрудников, который имеет две конечные точки HTTP — получить все и создать:

    GET /employees POST /employees

Для связи между клиентом и сервером мы Воспользуемся простым DTO для инкапсуляции основных данных о сотрудниках:

public class Employee {
    public long id;
    public String title;

    // standard constructor and setters/getters
}

Теперь мы готовы написать код, использующий RestTemplate для получения и создания списков объектов Employee.

3. Получить список объектов с помощью RestTemplate

Обычно при вызове GET можно использовать один из упрощенных методов в RestTemplate, например:

getForObject(URI url, Class\u003cT\u003e responseType) ~~ ~ Это отправляет запрос на указанный URI с помощью команды GET и преобразует тело ответа в запрошенный тип Java. Это прекрасно работает для большинства классов, но имеет ограничение: мы не можем отправлять списки объектов.

Проблема связана со стиранием типов с помощью дженериков Java. Когда приложение работает, оно не знает, какой тип объекта находится в списке. Это означает, что данные в списке не могут быть десериализованы в соответствующий тип.

К счастью, у нас есть два способа обойти это.

3.1. Использование массивов

Во-первых, мы можем использовать RestTemplate.getForEntity() для ПОЛУЧЕНИЯ массива объектов через параметр responseType. Какой бы класс мы там ни указали, он будет соответствовать типу параметра ResponseEntity:

Кроме того, мы могли бы использовать RestTemplate.exchange для достижения того же результата.

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

Обратите внимание, что соавтор, выполняющий тяжелую работу здесь, — это ResponseExtractor, поэтому, если нам нужна дополнительная настройка, мы можем вызвать execute и предоставить свой собственный экземпляр.

3.2. Использование класса-оболочки

Некоторые API возвращают объект верхнего уровня, содержащий список сотрудников, вместо непосредственного возврата списка. Чтобы справиться с этой ситуацией, мы можем использовать класс-оболочку, содержащий список сотрудников.

Теперь мы можем использовать более простой метод getForObject() для получения списка сотрудников:

public class EmployeeList {
    private List<Employee> employees;

    public EmployeeList() {
        employees = new ArrayList<>();
    }

    // standard constructor and getter/setter
}

Этот код намного проще, но требует дополнительного объекта-оболочки.

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

4. Отправка списка объектов с помощью RestTemplate

Теперь давайте посмотрим, как отправить список объектов с нашего клиента на сервер. Как и выше, RestTemplate предоставляет упрощенный метод для вызова POST: преобразует ответ в указанный тип. В отличие от приведенного выше сценария GET, нам не нужно беспокоиться о стирании типа.

Это потому, что теперь мы переходим от объектов Java к JSON. Список объектов и их тип известны JVM и поэтому должны быть правильно сериализованы:

4.1. Использование класса-оболочки

Если нам нужно использовать класс-оболочку, чтобы соответствовать приведенному выше сценарию GET, это тоже просто. Мы можем отправить новый список с помощью RestTemplate:

5. Заключение

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

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

Использование RestTemplate — это простой способ создания HTTP-клиентов для связи с вашими службами.

Он предоставляет ряд методов для работы с каждым методом HTTP и простыми объектами. С небольшим количеством дополнительного кода мы можем легко использовать его для работы со списками объектов.

List<Employee> 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);

Как обычно, полный код доступен в проекте Github.

«

It provides a number of methods for working with every HTTP method and simple objects. With a little bit of extra code, we can easily use it to work with lists of objects.

As usual, the complete code is available in the Github project.