Весенний запросБоди и Аннотации в ответ
1. Введение
В этом кратком учебнике мы предоставляем краткий обзор весеннего @RequestBody и @ResponseBody Аннотации.
Дальнейшее чтение:
Руководство по картированию весенних обработчиков
Краткое руководство по весенним контроллерам
Аннотации @Controller и @RestController весны
2. @RequestBody
Проще говоря, @RequestBody аннотация карты HttpRequest тела к объекту передачи или домена, что позволяет автоматически дезириализация входящих HttpRequest тело на объект Java.
Во-первых, давайте посмотрим на метод контроллера Spring:
@PostMapping("/request") public ResponseEntity postController( @RequestBody LoginForm loginForm) { exampleService.fakeAuthenticate(loginForm); return ResponseEntity.ok(HttpStatus.OK); }
Весна автоматически дезирует JSON в java-тип, предполагая, что указан соответствующий тип.
По умолчанию тип, который мы аннотировать с @RequestBody аннотация должна соответствовать JSON, отправленной от нашего контроллера на стороне клиента:
public class LoginForm { private String username; private String password; // ... }
Здесь объект, который мы используем для представления HttpRequest карты тела к нашему ЛогинФорм объект.
Давайте проверить это с помощью CURL:
curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "https://localhost:8080/.../request"
Это все, что нам нужно для API Spring REST и углового клиента, используя ЗапросБоди аннотация.
3. @ResponseBody
@ResponseBody аннотация сообщает контроллеру, что возвращенный объект автоматически сериализируется в JSON и передается обратно в HttpРеспонс объект.
Предположим, у нас есть пользовательский Ответные объект:
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!!!"); } }
В консоли разработчика нашего браузера или с помощью инструмента, как Почтальон, мы можем увидеть следующий ответ:
{"text":"Thanks For Posting!!!"}
Помните, что нам не нужно аннотировать @RestController- аннотированные контроллеры с @ResponseBody аннотация с весны делает это по умолчанию.
3.1. Установка типа содержимого
Когда мы используем @ResponseBody аннотация, мы все еще можем явно установить тип содержимого, что наш метод возвращается.
Для этого, мы можем использовать @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 постоянный. Кроме того, мы можем использовать приложение/json прямо.
Далее давайте реализуем новый метод, отображенный на ту же /содержание путь, но вместо этого возвращающ содержимое XML:
@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("XML Content!"); }
Теперь, в зависимости от стоимости Примите параметр, отправленный в заголовке запроса, мы получим различные ответы.
Давайте посмотрим на это в действии:
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!"}
Теперь давайте изменим Примите параметр:
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 GMTXML Content!
4. Заключение
Мы создали простого Angular клиента для приложения Spring, который демонстрирует, как использовать @RequestBody и @ResponseBody Аннотации.
Кроме того, мы показали, как настроить тип содержимого при использовании @ResponseBody .
Как всегда, образцы кода доступны более на GitHub .