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

Получите тело HTTP-СООБЩЕНИЯ в весенней загрузке с помощью @RequestBody

В этой статье мы рассмотрим, как получить тело HTTP-СООБЩЕНИЯ весной с помощью аннотации @RequestBody и десериализовать его содержимое JSON в POJO для обработки.

Автор оригинала: 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 ResponseEntity postBody(@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 .