Вземете и публикувайте списъци на обекти с RestTemplate

1. Въведение

Класът RestTemplate е централният инструмент за извършване на клиентски HTTP операции през пролетта. Той предоставя няколко полезни метода за изграждане на HTTP заявки и обработка на отговори.

И тъй като RestTemplate се интегрира добре с Джаксън, той може да сериализира / десериализира повечето обекти към и от JSON без много усилия. Въпреки това, работата с колекции от предмети, не е толкова прост .

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

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

Ще използваме API на служител, който има две HTTP крайни точки - вземете всички и създайте:

  • GET / служители
  • POST / служители

За комуникация между клиент и сървър ще използваме прост DTO, за да капсулираме основните данни за служителите:

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

Вече сме готови да напишем код, който използва RestTemplate за получаване и създаване на списъци с обекти на служители .

3. Вземете списък с обекти с RestTemplate

Обикновено при извикване на GET можете да използвате един от опростените методи в RestTemplate , като например :

getForObject (URI url, Class responseType)

Това изпраща заявка до посочения URI с помощта на глагола GET и преобразува тялото на отговора в искания тип Java. Това работи чудесно за повечето класове, но има ограничение: не можем да изпращаме списъци с обекти.

Проблемът се дължи на изтриването на типа с Java generics. Когато приложението се изпълнява, то няма знания за типа обект в списъка. Това означава, че данните в списъка не могат да бъдат десериализирани в подходящия тип.

За щастие имаме две възможности да заобиколим това.

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

Първо, можем да използваме RestTemplate. getForEntity () за ПОЛУЧАВАНЕ на масив от обекти чрез параметъра responseType . Какъвто и клас да посочим там, ще съответства на типа параметър на ResponseEntity :

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

Освен това бихме могли да използваме RestTemplate.exchange, за да постигнем същия резултат.

Имайте предвид, че сътрудникът, който прави тежкото вдигане тук, е ResponseExtractor, така че ако се нуждаем от допълнително персонализиране, можем да извикаме изпълнение и да предоставим свой собствен екземпляр.

3.2. Използване на клас Wrapper

Някои API ще върнат обект от най-високо ниво, който съдържа списъка на служителите, вместо да го връща директно. За да се справим с тази ситуация, можем да използваме клас обвивка, който съдържа списъка на служителите.

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

Сега можем да използваме по- простия метод getForObject () , за да получим списъка със служители:

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

Този код е много по-опростен, но изисква допълнителен обект на обвивка.

4. Публикувайте списък с обекти с RestTemplate

Сега нека разгледаме как да изпратим списък с обекти от нашия клиент на сървъра. Точно както по-горе, RestTemplate предоставя опростен метод за извикване на POST:

postForObject (URI url, Object request, Class responseType)

Това изпраща HTTP POST към дадения URI с незадължителното тяло на заявката и преобразува отговора в посочения тип. За разлика от GET сценария по-горе, ние не трябва да се тревожим за изтриване на типа .

Това е така, защото сега преминаваме от Java обекти към JSON. Списъкът на обектите и техният тип са известни на JVM и следователно трябва да бъдат правилно сериализирани:

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

Ако трябва да използваме клас на обвивка, за да бъдем в съответствие с GET сценария по-горе, това също е просто. Можем да изпратим нов списък с помощта на RestTemplate :

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

Използването на RestTemplate е лесен начин за изграждане на HTTP клиенти за комуникация с вашите услуги.

Той предоставя редица методи за работа с всеки HTTP метод и прости обекти. С малко допълнителен код можем лесно да го използваме за работа със списъци с обекти.

Както обикновено, пълният код е достъпен в проекта Github.