Рубрики
Без рубрики

Получение и публикация списков объектов с помощью RestTemplate

Узнайте, как ПОЛУЧАТЬ и публиковать списки объектов с помощью RestTemplate Spring

Автор оригинала: Michael Pratt.

1. введение

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

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

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

Дальнейшее чтение:

Обработка ошибок пружинной пластины

RestTemplate Post Запрос с JSON

2. Пример обслуживания

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

  • ПОЛУЧИТЬ/сотрудники
  • ДОЛЖНОСТЬ/сотрудники

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

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

    // standard constructor and setters/getters
}

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

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

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

getForObject(URL-адрес URI, тип ответа класса )

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

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

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

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

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

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

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

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

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

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

public class EmployeeList {
    private List employees;

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

    // standard constructor and getter/setter
}

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

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

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

4. Опубликуйте список объектов с помощью RestTemplate

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

postForObject(URL-адрес URI, запрос объекта, тип ответа класса )

Это отправляет HTTP-СООБЩЕНИЕ в указанный URI с необязательным телом запроса и преобразует ответ в указанный тип. В отличие от приведенного выше сценария GET, нам не нужно беспокоиться об удалении типа .

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

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. Использование класса-оболочки

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

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. Заключение

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

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

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