使用 Spring WebFlux 的 header API 版本控制的干净解决方案?
clean solution for header API versioning using Spring WebFlux?
尝试使用 RouterFunction 在 Spring WebFlux 中使用 HTTP header 进行 API 版本控制。
使用 Spring WebFlux RouterFunction 无法使用
@GetMapping(headers = "API-VERSION=1.0.0")
注释。
我目前的尝试,在我看来这不是一个好的尝试。
public Mono<ServerResponse> heartBeat(ServerRequest request) {
final String apiVersion = request.headers().header("API-Version").get(0);
switch (apiVersion) {
case "1.0.0":
return heartBeatV1_0_0(request);
case "1.0.1":
return heartBeatV1_0_1(request);
default:
return heartBeatV1_0_0(request);
}
}
有没有更好的方法?
我认为你的方法没问题,但如果你正在寻找其他方法,你可以使用 RouterFunction
路由你的版本。像这样:
@Bean
RouterFunction<ServerResponse> routerFunction() {
return RouterFunctions
.route(
GET("/your/path").and(headers(headers -> testVersion(headers, "1.0.0"))),
/* handler function 1.0.0 */)
.andRoute(
GET("/your/path").and(headers(headers -> testVersion(headers, "1.0.1"))),
/* handler function 1.0.1 */);
}
private boolean testVersion(ServerRequest.Headers headers, String version) {
return headers.header("API-Version")
.stream()
.anyMatch(headerValue -> Objects.equals(headerValue, version));
}
尝试使用 RouterFunction 在 Spring WebFlux 中使用 HTTP header 进行 API 版本控制。
使用 Spring WebFlux RouterFunction 无法使用
@GetMapping(headers = "API-VERSION=1.0.0")
注释。
我目前的尝试,在我看来这不是一个好的尝试。
public Mono<ServerResponse> heartBeat(ServerRequest request) {
final String apiVersion = request.headers().header("API-Version").get(0);
switch (apiVersion) {
case "1.0.0":
return heartBeatV1_0_0(request);
case "1.0.1":
return heartBeatV1_0_1(request);
default:
return heartBeatV1_0_0(request);
}
}
有没有更好的方法?
我认为你的方法没问题,但如果你正在寻找其他方法,你可以使用 RouterFunction
路由你的版本。像这样:
@Bean
RouterFunction<ServerResponse> routerFunction() {
return RouterFunctions
.route(
GET("/your/path").and(headers(headers -> testVersion(headers, "1.0.0"))),
/* handler function 1.0.0 */)
.andRoute(
GET("/your/path").and(headers(headers -> testVersion(headers, "1.0.1"))),
/* handler function 1.0.1 */);
}
private boolean testVersion(ServerRequest.Headers headers, String version) {
return headers.header("API-Version")
.stream()
.anyMatch(headerValue -> Objects.equals(headerValue, version));
}