如何使用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上获得。