Справочник по условиям

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Условия позволяют прокси API вести себя динамически во время выполнения. Условия определяют операции с переменными, которые оцениваются конвейером обработки Apigee Edge. Условные операторы имеют логическое значение и всегда оцениваются как true или false.

Обзор условий

В этом разделе рассказывается, как и где использовать условные операторы в Edge. Кроме того, в следующих разделах описан синтаксис:

Структура условных операторов

Базовая структура условного оператора выглядит следующим образом:

<Condition>variable.name operator "value"</Condition>

Пример:

<Condition>request.verb = "GET"</Condition>

Вы можете объединить условия с помощью оператора AND, чтобы применить сразу несколько условий. Например, следующие условия будут иметь значение true, только если URI запроса соответствует /statuses и HTTP-метод запроса – GET:

<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>

Где можно использовать условные операторы

Условия можно использовать для управления поведением в следующих случаях:

Выполнение правил

С помощью условных операторов можно управлять применением правил. Часто используется условное преобразование сообщений ответа на основе заголовка HTTP или содержимого сообщения.

В следующем примере показано, как условно преобразовать XML в JSON на основе заголовка Accept:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

Выполнение процесса

С помощью условных операторов можно управлять выполнением именованных потоков в ProxyEndpoints и TargetEndpoints. Обратите внимание, что условное выполнение возможно только для именованных потоков. Предварительные и последующие потоки (как запросы, так и ответы) в ProxyEndpoint и TargetEndpoint выполняются для каждой транзакции и, таким образом, обеспечивают безусловные возможности "отказа от безопасности".

Например, чтобы выполнить условный запрос на основе HTTP-метода запроса и условный ответ на основе (потенциального) кода статуса HTTP, представляющего ошибку:

<Flow name="GetRequests">
  <Condition>request.verb = "GET"</Condition>
  <Request>
    <Step>
      <Condition>request.path MatchesPath "/statuses/**"</Condition>
      <Name>StatusesRequestPolicy</Name>
    </Step>
  </Request>
  <Response>
    <Step>
      <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
      <Name>MaintenancePolicy</Name>
    </Step>
  </Response>
</Flow>

Выбор маршрута целевой конечной точки

С помощью условных операторов можно управлять целевой конечной точкой, вызываемой конфигурацией конечной точки прокси. Правило маршрутизации пересылает запрос в определенную целевую конечную точку. Если доступно несколько целевых конечных точек, правило маршрута оценивается на соответствие условию, и если оно соблюдается, запрос пересылается в указанную целевую конечную точку.

Например, чтобы условно направлять письма в определенные конечные точки на основе Content-Type:

<RouteRule name="default">
 <!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
  <Condition>request.header.Content-Type = "text/xml"</Condition>
  <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>

Подробнее о переменных и условиях…

Выражения пути

Выражения пути используются для сопоставления путей URI. Символ "*" представляет один элемент пути, а "**" – несколько уровней URI.

Пример:

Шаблон Примеры совпадений путей URI
/*/a/ /x/a/ или /y/a/
/*/a/* /x/a/b или /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/*/feed/ /x/a/b/feed/ или /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

% рассматривается как экранирующий символ. Шаблон %{user%} соответствует {user}, но не user.

Переменные

В условных операторах можно использовать как встроенные, так и специальные переменные. Статьи по теме

Операторы

При использовании операторов соблюдайте следующие ограничения:

  • Операторы нельзя использовать в качестве названий переменных.
  • Перед оператором и после него должен быть пробел.
  • Чтобы включить оператор в переменную, название переменной нужно заключить в одинарные кавычки. например 'request.header.help!me' (2-е издание).
  • Арифметические операторы (+ * - / %) не поддерживаются.
  • Для операторов используется приоритет Java.
  • Apigee Edge использует регулярные выражения, реализованные в java.util.regex.

В таблице ниже перечислены поддерживаемые операторы. В выражениях можно использовать символ или слово:

Символ Microsoft Word Описание
! Not, not Унарный оператор (принимает один входной параметр)
= Equals, Is Равно (с учетом регистра)
!= NotEquals, IsNot Не равно (с учетом регистра)
:= EqualsCaseInsensitive Равно (без учета регистра)
> или &gt; GreaterThan Больше. Если при определении условия в интерфейсе Edge вы используете символ >, он преобразуется в &gt;.
>= или &gt;= GreaterThanOrEquals Больше или равно. Если при определении условия в интерфейсе Edge вы используете >=, оно преобразуется в &gt;=.
&lt; LesserThan Меньше. Интерфейс Edge не поддерживает символ <.
&lt;= LesserThanOrEquals Меньше или равно. Интерфейс Edge не поддерживает символ <=.
&& And, and И
|| Or Оператор "ИЛИ" не учитывает регистр. Например, OR, Or и or – все это допустимые значения.
() Группирует выражение. Открывающая скобка ( начинает выражение, а закрывающая ) – завершает его.
~~ JavaRegex

Соответствует регулярному выражению, совместимому с javax.util.regex. Сопоставление выполняется с учетом регистра. Примеры можно найти в разделе Сопоставление шаблонов в условных операторах.

~ Matches, Like Соответствует шаблону в стиле glob с использованием подстановочного знака "*". Сопоставление выполняется с учетом регистра. Примеры можно найти в статье Сопоставление шаблонов с условными операторами.
~/ MatchesPath, LikePath Соответствует выражению пути. Сопоставление выполняется с учетом регистра. Примеры можно найти в статье Сопоставление шаблонов с условными операторами.
=| StartsWith Соответствует первым символам строки. Сопоставление выполняется с учетом регистра.

Операнды

Apigee Edge приводит операнды к общему типу данных, прежде чем сравнивать их. Например, если код статуса ответа – 404, то выражения response.status.code = "400" и response.status.code = 400 эквивалентны.

Для числовых операндов тип данных интерпретируется как целое число, если значение не завершается следующим образом:

  • "f" или "F" (число с плавающей запятой, например 3.142f, 91.1F).
  • "d" или "D" (двойная точность, например 3.142d, 100.123D).
  • l или L (long, например 12321421312L);

В таких случаях система выполняет адаптацию, описанную в таблице ниже (где RHS – правая часть уравнения, а LHS – левая):

RHS LHS Логическое значение Целое число Длинный Число с плавающей запятой Двойной трекер Строка Сопоставимая Объект
Логическое значение Логическое значение Целое число Длинный Число с плавающей запятой Двойной трекер Строка -
Целое число Целое число Целое число Длинный Число с плавающей запятой Двойной трекер Строка Сопоставимая -
Длинный Длинный Длинный Длинный Число с плавающей запятой Двойной трекер Строка Сопоставимая -
Число с плавающей запятой Число с плавающей запятой Число с плавающей запятой Число с плавающей запятой Число с плавающей запятой Двойной трекер Строка Сопоставимая -
Двойной трекер Двойной трекер Двойной трекер Двойной трекер Двойной трекер Двойной трекер Строка Сопоставимая -
Строка Строка Строка Строка Строка Строка Строка Сопоставимая -
Сопоставимая Сопоставимая Сопоставимая Сопоставимая Сопоставимая Сопоставимая Сопоставимая Сопоставимая -
Объект - - - - - - - -

Нулевые операнды

В таблице ниже показано, какое значение (true или false) возвращается при оценке условий, если слева (LHS) и/или справа (RHS) от операнда указано нулевое значение:

Оператор Пустое значение в левой части RHS null Пустое значение в левой и правой частях
=, ==, := false false true
=| false false false
!= true true false
> или &gt; true false false
>= или &gt;= false true true
&lt; true false false
&lt;= true false true
~ false – false
~~ false – false
!~ true false false
~/ false – false

Литералы

Помимо строковых и числовых литералов, в условных операторах можно использовать следующие литералы:

  • null
  • true
  • false

Пример:

  • request.header.host is null
  • flow.cachehit is true

Примеры

<RouteRule name="default">
     <Condition>request.header.content-type = "text/xml"</Condition>
     <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
<Step>
    <Condition>response.status.code = 503</Condition>
    <Name>MaintenancePolicy</Name>
</Step>
<Flow name="GetRequests">
    <Condition>response.verb="GET"</Condition>
    <Request>
        <Step>
            <Condition>request.path ~ "/statuses/**"</Condition>
            <Name>StatusesRequestPolicy</Name>
        </Step>
    </Request>
    <Response>
        <Step>
            <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
            <Name>MaintenancePolicy</Name>
        </Step>
    </Response>
</Flow>