J'utilise Spring Cloud Gateway 2.0.0.M6 pour tester une passerelle simple. Je veux juste qu'une URL soit transmise à une autre avec ** regex
Exemple 1:/integration/sbl/foo/bar => localhost: 4178/a-integration/sbl/foo/bar}
Exemple 2:/integration/sbl/baz/bad => localhost: 4178/a-integration/sbl/baz/bad}
Jusqu'à présent, j'ai écrit ce qui suit, mais il ne fait que le transmettre à http: // localhost: 4178/a-integration/
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
String test = "http://localhost:4178/a-integration/";
return builder.routes()
.route("integration-test",
r -> r.path("/integration/sbl/**")
.uri(test)
)
.build();
}
Comment puis-je corriger le code ci-dessus pour activer ce comportement?
MODIFIER
J'ai essayé ce qui suit en fonction de la réponse ci-dessous
String samtykke = "http://localhost:4178/";
return builder.routes()
.route("samtykke", r -> r
.path("/gb-integration/sbl/**")
.filters(f -> f.rewritePath("/gb-integration/sbl/(?<segment>.*)", "/gb-samtykke-integration/${segment}"))
.uri(samtykke))
.build();
et j'ai essayé un GET http: // localhost: 4177/gb-integration/sbl/api/sbl/revenu/ et attendu http: // localhost: 4178/gb-samtykke-integration/api/sbl/revenu/ retour mais ça n'a pas marché.
La sortie dit:
2018-02-23 09:46:35.197 TRACE 6364 --- [ctor-http-nio-2] o.s.c.g.h.p.RoutePredicateFactory : Pattern "/gb-integration/sbl/**" matches against value "[path='/gb-integration/sbl/api/sbl/income/']"
2018-02-23 09:46:35.198 DEBUG 6364 --- [ctor-http-nio-2] o.s.c.g.h.RoutePredicateHandlerMapping : Route matched: samtykke
2018-02-23 09:46:35.198 DEBUG 6364 --- [ctor-http-nio-2] o.s.c.g.h.RoutePredicateHandlerMapping : Mapping [Exchange: GET http://localhost:4177/gb-integration/sbl/api/sbl/income/] to Route{id='samtykke', uri=http://localhost:4178/, order=0, predicate=org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$245/1803714790@1d0042df, gatewayFilters=[OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory$$Lambda$247/485237151@77da026a, order=0}]}
2018-02-23 09:46:35.200 DEBUG 6364 --- [ctor-http-nio-2] o.s.c.g.handler.FilteringWebHandler : Sorted gatewayFilterFactories: [OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@5c534b5b}, order=-1}, OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory$$Lambda$247/485237151@77da026a, order=0}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@396639b}, order=10000}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyRoutingFilter@a18649a}, order=2147483647}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.ForwardRoutingFilter@2b22a1cc}, order=2147483647}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@62573c86}, order=2147483647}]
2018-02-23 09:46:35.232 TRACE 6364 --- [ctor-http-nio-2] o.s.c.g.filter.RouteToRequestUrlFilter : RouteToRequestUrlFilter start
2018-02-23 09:46:35.314 TRACE 6364 --- [ctor-http-nio-1] o.s.c.g.filter.NettyWriteResponseFilter : NettyWriteResponseFilter start
Vous pouvez utiliser la fonctionnalité rewritePath dans vos filtres de chemin, comme spécifié dans la documentation disponible ici:
Parties pertinentes:
5.12 Fabrique de filtres Gateway RewritePath
RewritePath GatewayFilter Factory utilise un paramètre regexp de chemin et un paramètre de remplacement. Ceci utilise des expressions régulières Java pour un manière flexible de réécrire le chemin de requête.
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: http://example.org
predicates:
- Path=/foo/**
filters:
- RewritePath=/foo/(?<segment>.*), /$\{segment}
Pour un chemin de requête de/foo/bar, cela définira le chemin sur/bar avant faire la demande en aval. Notez le $\qui est remplacé par $ en raison de la spécification YAML.
Dans votre exemple, cela ressemblerait à ceci:
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
String test = "http://localhost:4178";
return builder.routes()
.route("integration-test", r -> r
.path("/integration/sbl/**")
.filters(f->f.rewritePath("/integration/(?<segment>.*)","/a-integration/${segment}"))
.uri(test)
)
.build();
}
Nous avions un problème similaire ici, et bien que je sois d’accord avec la réponse de Boyen, il peut être utile de signaler que le paramètre "uri" ignore le composant "path" de l’URI. Ce n'est pas clair dans la documentation (ou je ne l'ai pas trouvée au moins), j'espère donc que cela aidera les autres.
Supposons que vous souhaitiez rediriger toutes les demandes reçues sur/foo vers http://example.org/bar
Par exemple:/foo/x/y/z -> http://example.org/bar/x/y/z
Par exemple, cela fonctionne comme prévu:
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: http://example.org
predicates:
- Path=/foo/**
filters:
- RewritePath=/foo/(?<segment>.*), /bar/$\{segment}
Bien que cela ne fonctionne pas comme prévu (il ignore/barre):
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: http://example.org/bar
predicates:
- Path=/foo/**
filters:
- RewritePath=/foo/(?<segment>.*), /$\{segment}
Veuillez trouver ci-dessous les deux types de configuration avec une configuration complète. Les deux méthodes produisent le même résultat.
http://localhost:8090
/context
sert de point d'entrée de la passerellemy-resources
fonctionnant sur http://localhost:8091/my-resources
. Lorsque /my-resources
est appelé sans paramètre, toutes les ressources sont renvoyées. Lorsqu'il est appelé avec un paramètre, il renvoie la ressource avec la variable RID
correspondante (le cas échéant).La passerelle est configurée pour que toutes les variables de chemin d'accès (éventuellement aucune) transmises à http://localhost:8090/context/my-resources/
soient transférées à uri http://localhost:8091/my-resources/
.
application.yml
spring:
cloud:
gateway:
routes:
- id: route_id
predicates:
- Path=/context/my-resources/**
filters:
- RewritePath=/context/my-resources/(?<RID>.*), /my-resources/$\{RID}
uri: http://localhost:8091
@Bean
public RouteLocator routes(RouteLocatorBuilder routeBuilder) {
return routeBuilder.routes()
.route("route_id",
route -> route
.path("/context/my-resources/**")
.filters(f -> f.rewritePath("/context/my-resources/(?<RID>.*)", "/my-resources/${RID}"))
.uri("http://localhost:8091")
)
.build();
}