Весенний облачный шлюз: Перезапись URI во входящих запросах

#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