Автор оригинала: David Landup.
Вступление
С помощью Spring мы сопоставляем запросы обработчикам запросов с помощью аннотации @RequestMapping
. Spring Boot познакомил нас с производными типами этой аннотации – @GetMapping
, @PostMapping
, @DeleteMapping
и т. Д.
Эти запросы содержат различные типы информации и данных – и в зависимости от того, что наша конечная точка делает с запросом, мы можем захотеть получить тело запроса POST
либо для регистрации, либо для дальнейшей обработки.
Аннотация @RequestBody
позволяет нам получить тело запроса. Затем мы можем вернуть его в виде строки или десериализовать в Обычный старый объект Java (POJO).
Spring имеет встроенные механизмы десериализации объектов JSON и XML в POJOS, что также значительно облегчает эту задачу.
В этой статье мы получим тело HTTP-запроса POST
и упакуем его в строку, а также десериализуем его в POJO.
Получение тела HTTP – СООБЩЕНИЯ в виде строки
Давайте начнем с класса @Controller
для обработки входящего запроса:
@ResponseBody @Controller @RequestMapping("/response") public class HomeController {}
Здесь стоит отметить, что мы добавили аннотацию @ResponseBody
к @Контроллеру
. Таким образом, он не будет отображать шаблон в качестве тела ответа, а скорее вернет тело ответа. В частности, мы упакуем его в строку и вернем ее.
Spring Boot познакомил нас с другим производным типом – @RestController
, который представляет собой просто комбинацию двух предыдущих аннотаций. Давайте вместо этого для краткости воспользуемся этим:
@RestController @RequestMapping("/response") public class HomeController {}
Теперь давайте продолжим и определим обработчик запроса. Поскольку мы обрабатываем запрос POST
, мы будем использовать для него аннотацию @PostMapping
:
@RestController @RequestMapping("/response") public class HomeController { @PostMapping("/postbody") public String postBody(@RequestBody String fullName) { return "Hello " + fullName; } }
Чтобы получить тело запроса POST
, отправленного обработчику, мы будем использовать аннотацию @RequestBody
и присвоим ее значение строке. Это берет тело запроса и аккуратно упаковывает его в строку полное имя
. Затем мы вернули это имя обратно с приветственным сообщением.
Давайте протестируем этот контроллер с помощью curl
:
curl -X POST -H "Content-type: application/json" -d "John Smith" "http://localhost:8080/response/postbody"
Это приводит к:
Hello John Smith
Десериализуйте HTTP-СООБЩЕНИЕ в POJO
Теперь, как правило, мы не будем работать со строками, хотя они служат хорошим примером для обучения. В большинстве случаев мы захотим выполнить некоторую обработку или, по крайней мере, сериализовать запрос в POJO. Давайте определим Человека
POJO с Именем
и Фамилией
:
public class Person { private String firstName; private String lastName; // Constructor, getters and setters }
Мы выполним тот же процесс, что и в предыдущем примере, – с тем же контроллером. Однако на этот раз мы уточним, что контроллер принимает значения JSON и XML и выдает ответные ответы в формате JSON или XML.
Мы получим тело запроса POST
в формате JSON, десериализуем его в POJO для дальнейшей обработки (например, сохранения в базе данных) и вернем ответ JSON.
Хотя Spring Boot может автоматически сопоставлять тело JSON с нашим POJO, учитывая совпадение имен переменных, мы явно установим этот параметр. Мы установим форматы ввода и вывода, используя флаги потребляет
и производит
в @PostMapping
:
@RestController @RequestMapping("/response") public class HomeController { @PostMapping( value = "/postbody", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) public ResponseEntitypostBody(@RequestBody Person person) { Person persistedPerson = personService.save(person); return ResponseEntity .created(URI .create(String.format("/persons/%s", person.getFirstName()))) .body(persistedPerson); } }
Здесь мы принимаем JSON и XML, а также возвращаем их обратно. Мы аннотировали экземпляр Person
как @RequestBody
, что мы также будем ожидать от запроса. Затем мы использовали экземпляр службы Person
для сохранения человека в базе данных, которая также возвращает сохраненный объект для дальнейшей обработки.
Для краткости мы опустили реализацию Person Service
, поскольку это стандартная реализация уровня обслуживания.
Наконец, мы вернули объект ResponseEntity
. Это просто расширение класса HttpEntity
, у которого также есть код состояния. Мы установили код статуса как СОЗДАН
с URI
местоположением, в котором находится новый созданный ресурс. Затем мы установили тело ResponseEntity
в качестве постоянного лица
экземпляра и построили ответ.
Давайте еще раз протестируем этот контроллер через curl
:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
curl -X POST -H "Content-type: application/json" -d "{\"firstName\" : \"John\", \"lastName\" : \"Smith\"}" "http://localhost:8080/response/postbody"
Здесь мы сделали запрос POST
с телом JSON, содержащим имя и фамилию человека, и отправили его на нашу конечную точку.
Конечная точка отвечает:
{"firstName":"John","lastName":"Smith"}
Вывод
В этом уроке мы рассмотрели два способа захвата тела HTTP-запроса POST
в контроллере загрузки Spring.
Используя аннотацию @RequestBody
, мы сопоставили тело со строкой и вернули ее. После этого мы определили POJO для десериализации входящего содержимого JSON, обработали его и, наконец, вернули ResponseEntity
.