#regex #spring-cloud-gateway
Вопрос:
Я довольно новичок в Spring Cloud Gateway и устал от регулярных выражений. Я поискал в Интернете, но не нашел ответа на этот вопрос. На самом деле, это мой первый пост о stackoverflow за 20-летнюю карьеру 🙂
Я пытаюсь разрешить движение в host1.com/enablement/requests и перешлите его в host2.com/enablement/request. Обратите внимание на отсутствие буквы s во втором URI. Я не видел ни одного примера того, как переписать этот URL-адрес. Это потому, что я упускаю из виду простое регулярное выражение?
Я видел это во многих примерах. Можете ли вы объяснить, что он делает?
- RewritePath=/enablement/workflow(?<segment>/?.*), ${segment}
spring:
cloud:
gateway:
routes:
- id: data_service_route
uri: host2.com/enablement
predicates:
- Path=/enablement/requests
- Method=POST,GET,PUT
filters:
- RewritePath=???
Любой совет/пример был бы очень признателен.
Джефф
Ответ №1:
Я играл с spring-cloud-gateway последние пару дней, позвольте мне попытаться объяснить:
RewritePath=/enablement/workflow(?<segment>/?.*), ${segment}
Здесь есть 2 выражения, разделенные запятой, регулярное выражение, используемое для сопоставления шаблонов, и строка замены.
(?<segment>/?.*)
создает именованную группу захвата, значение будет храниться под ключом «сегмент».
${segment}
является заменяющей строкой — в данном примере это будет значение захваченного сегмента группы. Люфт требуется для выхода(yaml).
так /enablement/workflow/endpoint
становится /endpoint
Очень простой фрагмент кода ниже:
String regexp = "/enablement/requests/(?<path>.*)";
String replacement = "/enablement/request/${path}";
String path = "hostname:port/enablement/requests/endpoint";
System.out.println(path.replaceAll(regexp, replacement));
Ниже приведена очень полезная ссылка для обновления регулярных выражений:
https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285
Ссылки на соответствующие классы spring-cloud-gateway ниже:
https://github.com/spring-cloud/spring-cloud-gateway/blob/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java
https://github.com/spring-cloud/spring-cloud-gateway/blob/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java