Аннотации Spring RequestBody и ResponseBody
В этом кратком руководстве мы предоставляем краткий обзор аннотаций Spring @RequestBody и @ResponseBody .
2. @RequestBody
Проще говоря, аннотация @RequestBody сопоставляет тело HttpRequest с объектом передачи или домена, обеспечивая автоматическую десериализацию входящего тела HttpRequest в объект Java.
Во-первых, давайте посмотрим на метод контроллера Spring:
@PostMapping("/request") public ResponseEntity postController( @RequestBody LoginForm loginForm) exampleService.fakeAuthenticate(loginForm); return ResponseEntity.ok(HttpStatus.OK); >
Spring автоматически десериализует JSON в тип Java, если указан соответствующий тип.
По умолчанию тип, который мы аннотируем аннотацией @RequestBody, должен соответствовать JSON, отправленному с нашего контроллера на стороне клиента:
public class LoginForm private String username; private String password; // . >
Здесь объект, который мы используем для представления тела HttpRequest , сопоставляется с нашим объектом LoginForm .
Давайте проверим это с помощью CURL:
curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '' "https://localhost:8080/. /request"
Это все, что нам нужно для Spring REST API и клиента Angular, использующего аннотацию @RequestBody .
3. @ResponseBody
Аннотация @ResponseBody сообщает контроллеру, что возвращаемый объект автоматически сериализуется в JSON и передается обратно в объект HttpResponse .
Предположим, у нас есть пользовательский объект Response :
public class ResponseTransfer private String text; // standard getters/setters >
Затем можно реализовать связанный контроллер:
@Controller @RequestMapping("/post") public class ExamplePostController @Autowired ExampleService exampleService; @PostMapping("/response") @ResponseBody public ResponseTransfer postResponseController( @RequestBody LoginForm loginForm) return new ResponseTransfer("Thanks For Posting. "); > >
В консоли разработчика нашего браузера или с помощью такого инструмента, как Postman, мы можем увидеть следующий ответ:
Помните, нам не нужно аннотировать контроллеры , аннотированные @RestController- , аннотацией @ResponseBody, поскольку Spring делает это по умолчанию.
3.1. Настройка типа содержимого
Когда мы используем аннотацию @ResponseBody , мы по-прежнему можем явно установить тип содержимого, возвращаемый нашим методом.
Для этого мы можем использовать атрибут products @RequestMapping . « Обратите внимание, что такие аннотации, как @PostMapping , @GetMapping и т. д ., определяют псевдонимы для этого параметра.
Теперь добавим новую конечную точку, которая отправляет ответ JSON:
@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseTransfer postResponseJsonContent( @RequestBody LoginForm loginForm) return new ResponseTransfer("JSON Content!"); >
В примере мы использовали константу MediaType.APPLICATION_JSON_VALUE . В качестве альтернативы мы можем использовать application/json напрямую.
Далее давайте реализуем новый метод, сопоставленный с тем же путем /content , но вместо этого возвращающий XML-контент:
@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent( @RequestBody LoginForm loginForm) return new ResponseTransfer("XML Content!"); >
Теперь, в зависимости от значения параметра Accept , отправленного в заголовке запроса, мы получим разные ответы.
Давайте посмотрим на это в действии:
curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '' "https://localhost:8080/. /content"
Команда CURL возвращает ответ JSON:
HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:06 GMT "text":"JSON Content!">
Теперь давайте изменим параметр Accept :
curl -i \ -H "Accept: application/xml" \ -H "Content-Type:application/json" \ -X POST --data '' "https://localhost:8080/. /content"
Как и ожидалось, на этот раз мы получаем XML-контент:
HTTP/1.1 200 Content-Type: application/xml Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:19 GMT ResponseTransfer>text>XML Content!/text>/ResponseTransfer>
4. Вывод
Мы создали простой клиент Angular для приложения Spring, демонстрирующий, как использовать аннотации @RequestBody и @ResponseBody .
Кроме того, мы показали, как установить тип контента при использовании @ResponseBody .
Как всегда, образцы кода доступны на GitHub .