如何使用Spring WebFlux返回404 | Spring For All

827 阅读2分钟
原文链接: www.spring4all.com

如何使用Spring WebFlux返回404

原文链接:www.baeldung.com/spring-webf…

作者: baeldung

译者: 清风九爷

1.概述

使用SpringBoot2和新的非阻塞服务器netty,我们不再拥有servlet上下文API,所以让我们来讨论如何使用新堆栈来表示不同类型的HTTP状态码。

2.语义响应状态

遵循标准的RESTful实践,我们自然需要利用全范围的HTTP状态代码来正确表达API的语义。

2.1 默认返回状态

当然,当一切顺利时,默认响应状态为200(OK):

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

2.2 使用注释

我们可以通过在方法上添加@ResponseStatus注解来改变默认返回状态

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

2.3 以编程方式更改状态

在某些情况下,根据我们服务器的行为,我们可以决定以编程方式更改返回的状态,而不是默认情况下使用的带前缀的返回状态或带注释。
我们可以直接在我们的方法中实现注入ServerHttpResponse :

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

现在我们可以选择在实现中返回的HTTP状态代码。

2.4 抛出异常

每次抛出异常时,都会省略默认的HTTP返回状态,Spring会尝试查找异常处理程序来处理它:

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

要了解有关如何执行此操作的更多信息,请务必查看有关Baeldung的错误处理文章。

2.5 使用ResponseEntity

现在让我们快速浏览一个有趣的替代方案 - ResponseEntity类。
这允许我们选择我们想要返回的HTTP状态,并使用非常有用的流畅API进一步自定义我们的响应:

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

2.5 使用功能端点

使用Spring 5,我们可以以功能方式定义端点,因此,我们也可以以编程方式更改默认HTTP状态:

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

3.结论

在实现HTTP API时,框架提供了许多选项,可以智能地处理我们向客户端公开的状态代码。

本文应该是一个很好的起点,可以探索这些并理解如何使用干净的RESTful语义推出富有表现力的友好API。

当然,本教程中使用的完整代码示例可在Github上获得。