使用Spring WebFlux进行标头API版本控制的简单解决方案?

时间:2019-02-13 08:17:55

标签: spring-webflux api-versioning

尝试使用RouterFunction在Spring WebFlux中使用HTTP标头进行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);
    }
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您的方法还可以,但是如果您正在寻找其他方法,则可以使用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));
}