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.