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

Как вернуть 404 с помощью пружинного веб-потока

Узнайте, как вернуть код состояния 404 в Spring Web Flux

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

1. Обзор

С Spring Boot 2 и новым неблокирующим сервером Netty у нас больше нет API Servletcontext, поэтому давайте обсудим, как мы можем выражать различные типы кодов состояния HTTP, используя новый стек.

2. Статус Семантического Ответа

Следуя стандартной практике RESTful, мы, естественно, должны использовать полный спектр кодов состояния HTTP, чтобы правильно выразить семантику API.

2.1. Статус Возврата По Умолчанию

Конечно, когда все идет хорошо, статус ответа по умолчанию – 200 (OK) :

@GetMapping(
  value = "/ok",
  produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public Flux ok() {
    return Flux.just("ok");
}

2.2. Использование аннотаций

Мы можем изменить статус возврата по умолчанию, добавив аннотацию @ResponseStatus к методу:

@GetMapping(
  value = "/no-content",
  produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
@ResponseStatus(HttpStatus.NO_CONTENT)
public Flux noContent() {
    return Flux.empty();
}

2.3. Изменение статуса программно

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

Мы можем добиться этого, вводя ServerHttpResponse непосредственно в наш метод:

@GetMapping(
  value = "/accepted",
  produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public Flux accepted(ServerHttpResponse response) {
    response.setStatusCode(HttpStatus.ACCEPTED);
    return Flux.just("accepted");
}

Теперь мы можем выбрать, какой код состояния HTTP мы возвращаем прямо в реализации.

2.4. Создание исключения

Каждый раз, когда мы создаем исключение, статус возврата HTTP по умолчанию опущен, и Spring пытается найти обработчик исключений, чтобы справиться с ним:

@GetMapping(
  value = "/bad-request"
)
public Mono badRequest() {
    return Mono.error(new IllegalArgumentException());
}
@ResponseStatus(
  value = HttpStatus.BAD_REQUEST,
  reason = "Illegal arguments")
@ExceptionHandler(IllegalArgumentException.class)
public void illegalArgumentHandler() {
    // 
}

Чтобы узнать больше о том, как это сделать, обязательно ознакомьтесь со статьей об обработке ошибок в Baeldung .

2.5. С ответственностью

Теперь давайте быстро рассмотрим интересную альтернативу – класс ResponseEntity .

Это позволяет нам выбирать, какой HTTP-статус мы хотим вернуть, а также настраивать наши ответы намного дальше, используя очень полезный fluent API:

@GetMapping(
  value = "/unauthorized"
)
public ResponseEntity> unathorized() {
    return ResponseEntity
      .status(HttpStatus.UNAUTHORIZED)
      .header("X-Reason", "user-invalid")
      .body(Mono.just("unauthorized"));
}

2.6. С Функциональными Конечными Точками

С помощью Spring 5 мы можем функционально определять конечные точки, поэтому мы также можем программно изменять статус HTTP по умолчанию:

@Bean
public RouterFunction notFound() {
    return RouterFunctions
      .route(GET("/statuses/not-found"),
         request -> ServerResponse.notFound().build());
}

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

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

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

Конечно, полные примеры кода, используемые в этом учебнике, доступны на Github .