Перейти к основному содержимому

Аннотации Spring RequestBody и ResponseBody

· 3 мин. чтения

1. Введение

В этом кратком руководстве мы предоставляем краткий обзор аннотаций 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
'{"username": "johnny", "password": "password"}' "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, мы можем увидеть следующий ответ:

{"text":"Thanks For Posting!!!"}

Помните, нам не нужно аннотировать контроллеры , аннотированные @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
'{"username": "johnny", "password": "password"}' "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
'{"username": "johnny", "password": "password"}' "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 .