Я пытаюсь создать простой API-шлюз, используя spring-cloud-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", и я не знаю, будет ли она содержать и сколько сегментов пути.
Как я могу добиться маршрутизации к полностью настроенной цели маршрутизации?




Хорошо, я нашел ответ: Согласно здесь намеренно игнорируется путь 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();
}