Перейти к основному содержимому

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

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Введение

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

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

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

2. Пример услуги

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

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

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

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

// standard constructor and setters/getters
}

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

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

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

getForObject (URI-адрес, Class<T> responseType)

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

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

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

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

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

ResponseEntity<Employee[]> 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<Employee> employees;

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

// standard constructor and getter/setter
}

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

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

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

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

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

postForObject (URL-адрес URI, запрос объекта, Class<T> responseType)

Это отправляет HTTP POST на указанный URI с необязательным телом запроса и преобразует ответ в указанный тип. В отличие от приведенного выше сценария GET, нам не нужно беспокоиться о стирании типа .

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

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

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

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

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

5. Вывод

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

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

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