Java response body json

Аннотации 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 .

Источник

Читайте также:  Online calculator in php
Оцените статью