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

Использование весенней реакции для манипулирования ответом HTTP

Узнайте, как манипулировать ответом HTTP с помощью класса ResponseEntity.

Автор оригинала: Attila Fejér.

Использование весенней реакции для манипулирования ответом HTTP

1. Введение

Используя Spring, мы обычно используем множество способов достижения одной и той же цели, включая доработку ответов HTTP.

В этом коротком учебнике мы увидим, как установить тело, статус и заготовки ответа HTTP с помощью ОтветВечность .

Дальнейшее чтение:

Получение и проверка данных ответов с помощью РЕСТ-гарантированного

Использование весеннего @ResponseStatus для настройки кода статуса HTTP

2. РеакцияВентие

ОтветВечность представляет весь ответ HTTP: код состояния, заготовки и тело . В результате мы можем использовать его для полной настройки ответа HTTP.

Если мы хотим использовать его, мы должны вернуть его из конечной точки; Весна заботится об остальном.

ОтветВечность является общим типом. Следовательно, мы можем использовать любой тип в качестве органа реагирования:

@GetMapping("/hello")
ResponseEntity hello() {
    return new ResponseEntity<>("Hello World!", HttpStatus.OK);
}

Так как мы указать статус ответа программно, мы можем вернуться с различными кодами статуса для различных сценариев:

@GetMapping("/age")
ResponseEntity age(
  @RequestParam("yearOfBirth") int yearOfBirth) {
 
    if (isInFuture(yearOfBirth)) {
        return new ResponseEntity<>(
          "Year of birth cannot be in the future", 
          HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity<>(
      "Your age is " + calculateAge(yearOfBirth), 
      HttpStatus.OK);
}

Кроме того, мы можем установить заготовки HTTP:

@GetMapping("/customHeader")
ResponseEntity customHeader() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Custom-Header", "foo");
        
    return new ResponseEntity<>(
      "Custom header set", headers, HttpStatus.OK);
}

Кроме того, ОтветВечность предоставляет два вложенных интерфейса строителя : ХедерсСтроитель и его подпотеря, BodyBuilder . Таким образом, мы можем получить доступ к их возможностям с помощью статических методов ОтветВечность .

Самый простой случай – это ответ с органом и кодом ответа HTTP 200:

@GetMapping("/hello")
ResponseEntity hello() {
    return ResponseEntity.ok("Hello World!");
}

Для самых популярных кодов статуса HTTP мы получаем статические методы:

BodyBuilder accepted();
BodyBuilder badRequest();
BodyBuilder created(java.net.URI location);
HeadersBuilder noContent();
HeadersBuilder notFound();
BodyBuilder ok();

Кроме того, мы можем использовать Статус BodyBuilder (статус HttpStatus) и Статус BodyBuilder (статус int) методы для настройки любого статуса HTTP.

Наконец, с ResponseEntity BodyBuilder.body (T body) мы можем установить орган реагирования HTTP:

@GetMapping("/age")
ResponseEntity age(@RequestParam("yearOfBirth") int yearOfBirth) {
    if (isInFuture(yearOfBirth)) {
        return ResponseEntity.badRequest()
            .body("Year of birth cannot be in the future");
    }

    return ResponseEntity.status(HttpStatus.OK)
        .body("Your age is " + calculateAge(yearOfBirth));
}

Мы также можем установить пользовательские заготовки:

@GetMapping("/customHeader")
ResponseEntity customHeader() {
    return ResponseEntity.ok()
        .header("Custom-Header", "foo")
        .body("Custom header set");
}

С BodyBuilder.body() возвращает ОтветВечность вместо Бодибилдер, это должен быть последний звонок.

Обратите внимание, что с ЗаголовокСтроитель мы не можем установить какие-либо свойства органа реагирования.

Возвращаясь ResponseEntity объект от контроллера, мы можем получить исключение или ошибку при обработке запроса и хотели бы вернуть информацию, связанную с ошибками, пользователю, представленную как другой тип, скажем, E .

Весна 3.2 приносит поддержку глобальной @ExceptionHandler с новым @ControllerAdvice аннотация, который обрабатывает такого рода сценарии. Для получения подробной информации обратитесь к нашей существующей статье здесь .

В то ОтветВечность очень мощный, мы не должны злоупотреблять им. В простых случаях существуют и другие варианты, которые удовлетворяют наши потребности, и они приводят к гораздо более чистому коду.

3. Альтернативы

3.1. @ResponseBody

В классических приложениях Spring MVC конечные точки обычно возвращают оказанные HTML-страницы. Иногда нам нужно только вернуть фактические данные; например, когда мы используем конечную точку с AJAX.

В таких случаях мы можем отметить метод обработчика запросов @ResponseBody , и Весна рассматривает результат значение метода, как орган реагирования HTTP себя.

Для получения дополнительной информации, эта статья является хорошим местом для начала .

3.2. @ResponseStatus

Когда конечная точка возвращается успешно, Spring предоставляет ответ HTTP 200 (OK). Если конечная точка бросает исключение, Spring ищет обработчик исключений, который сообщает, какой статус HTTP использовать.

Мы можем отметить эти методы @ResponseStatus, а значит, и весенним возвращается с пользовательским статусом HTTP .

Для получения дополнительных примеров, пожалуйста, посетите нашу статью о пользовательских кодов статуса .

3.3. Непосредственное манипулирование ответом

Весна также позволяет нам получить доступ к Javax.servlet.http.HttpServletРеспонс объект напрямую; мы только должны объявить его в качестве аргумента метода:

@GetMapping("/manual")
void manual(HttpServletResponse response) throws IOException {
    response.setHeader("Custom-Header", "foo");
    response.setStatus(200);
    response.getWriter().println("Hello World!");
}

Поскольку Spring предоставляет абстракции и дополнительные возможности, выше базовой реализации, мы не должны манипулировать ответом таким образом, .

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

В этой статье мы обсудили несколько способов манипулирования ответом HTTP весной и изучили их преимущества и недостатки.

Как обычно, примеры доступны более на GitHub .