spring 云网关仅转发到 url 的基本路径

spring cloud gateway only forwards to base path of url

我正在尝试使用 spring-cloud-gateway 构建一个简单的 api-gateway。到目前为止,我了解了基本原理,但我 运行 遇到了一个特定问题:

我转发请求的目标 url 可能包含零个、一个或多个路径段。不幸的是,这些路径段被忽略了。


private final String routingTargetWithPath = "http://hapi.fhir.org/baseR4";

  @Bean
  public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("patient", r -> r
            .path("/Patient", "/Patient/*")
            .and()
            .method(GET)
            .uri(routingTargetWithPath)
        )
        .build();
  }

使用 curl 将请求发送到我的 api-网关:

curl http://localhost:8080/Patient
  and accordingly
curl http://localhost:8080/Patient/2069748

我假设请求将被路由到:

http://hapi.fhir.org/baseR4/Patient
  and accordingly
http://hapi.fhir.org/baseR4/Patient/2069748

但是他们被路由到:

http://hapi.fhir.org/Patient
  and accordingly
http://hapi.fhir.org/Patient/2069748

所以,配置路由的路径url被忽略了。 不幸的是,我不能在这里进行手动重写,因为在生产中将配置“routingTarget”,但我不知道它是否包含以及包含多少路径段。

如何实现路由到完整配置的路由目标?

好的,我找到了答案: 根据 here 是有意的,uri 的路径被忽略了。 所以在我的例子中,设置路径过滤器可以解决问题:

private final URI routingTargetWithPath = URI.create("http://hapi.fhir.org/baseR4");

  @Bean
  public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("patient", r -> r
            .path("/Patient", "/Patient/*")
            .and()
            .method(GET)
            .filters(f -> f.prefixPath(routingTargetWithPath.getPath()))
            .uri(routingTargetWithPath)
        )
        .build();
  }