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 .