Ссылка на условия

Вы просматриваете документацию 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. Обратите внимание, что только «именованные» потоки могут выполняться условно. Предварительные и постпотоки (как запросы, так и ответы) на ProxyEndpoints и TargetEndpoints выполняются для каждой транзакции и, таким образом, обеспечивают безусловные «отказоустойчивые» возможности.

Например, чтобы выполнить поток условного запроса на основе команды 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

% рассматривается как escape-символ. Шаблон %{user%} соответствует {user} но не user .

Переменные

В условных операторах можно использовать как встроенные переменные потока, так и пользовательские переменные. Для получения дополнительной информации см.:

Операторы

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

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

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

Символ Слово Описание
! 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 и or .
() Группирует выражение. ( открывает выражение и ) закрывает его.
~~ JavaRegex

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

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

Операнды

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

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

  • «f» или «F» (float, например, 3.142f, 91.1F)
  • «д» или «Д» (двойной, например, 3.142д, 100.123Д)
  • «л» или «Л» (длинное, например, 12321421312Л)

В этих случаях система выполняет адаптацию, показанную в следующей таблице (где RHS относится к правой части уравнения, а LHS — к левой стороне):

правая левая левая логическое значение Целое число Длинный Плавать Двойной Нить Сопоставимый Объект
логическое значение логическое значение Целое число Длинный Плавать Двойной Нить -
Целое число Целое число Целое число Длинный Плавать Двойной Нить Сопоставимый -
Длинный Длинный Длинный Длинный Плавать Двойной Нить Сопоставимый -
Плавать Плавать Плавать Плавать Плавать Двойной Нить Сопоставимый -
Двойной Двойной Двойной Двойной Двойной Двойной Нить Сопоставимый -
Нить Нить Нить Нить Нить Нить Нить Сопоставимый -
Сопоставимый Сопоставимый Сопоставимый Сопоставимый Сопоставимый Сопоставимый Сопоставимый Сопоставимый -
Объект - - - - - - - -

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

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

Оператор левая шкала нуль правая шкала нулевая Левая и правая ноль
= , == , := ЛОЖЬ ЛОЖЬ истинный
=| ЛОЖЬ ЛОЖЬ ЛОЖЬ
!= истинный истинный ЛОЖЬ
> или &gt; истинный ЛОЖЬ ЛОЖЬ
>= или &gt;= ЛОЖЬ истинный истинный
&lt; истинный ЛОЖЬ ЛОЖЬ
&lt;= истинный ЛОЖЬ истинный
~ ЛОЖЬ Н/Д ЛОЖЬ
~~ ЛОЖЬ Н/Д ЛОЖЬ
!~ истинный ЛОЖЬ ЛОЖЬ
~/ ЛОЖЬ Н/Д ЛОЖЬ

Литералы

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

  • 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>