Рубрики
Без рубрики

Весенний запросБоди и Аннотации в ответ

Узнайте о весеннем @RequestBody и @ResponseBody аннотациях.

Автор оригинала: baeldung.

Весенний запросБоди и Аннотации в ответ

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 GMT

XML Content!

4. Заключение

Мы создали простого Angular клиента для приложения Spring, который демонстрирует, как использовать @RequestBody и @ResponseBody Аннотации.

Кроме того, мы показали, как настроить тип содержимого при использовании @ResponseBody .

Как всегда, образцы кода доступны более на GitHub .