Вы просматриваете документацию 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
.
Переменные
В условных операторах можно использовать как встроенные переменные потока, так и пользовательские переменные. Для получения дополнительной информации см.:
- Справочник по переменным потока : полный список встроенных переменных.
- Политика ExtractVariables : инструкции по настройке пользовательских переменных.
Операторы
При использовании операторов соблюдайте следующие ограничения:
- Операторы не могут использоваться в качестве имен переменных.
- До и после оператора требуется пробел.
- Чтобы включить оператор в переменную, имя переменной должно быть заключено в одинарные кавычки. Например,
'request.header.help!me'
. - Арифметические операторы (
+ * - / %
) не поддерживаются. - Приоритет Java используется для операторов.
- Apigee Edge использует регулярные выражения, реализованные в
java.util.regex
.
В следующей таблице перечислены поддерживаемые операторы. Вы можете использовать символ или слово в своих выражениях:
Символ | Слово | Описание |
---|---|---|
! | Not , not | Унарный оператор (принимает один вход) |
= | Equals , Is | Равно (с учетом регистра) |
!= | NotEquals , IsNot | Не равно (с учетом регистра) |
:= | EqualsCaseInsensitive | Равно, но не чувствительно к регистру |
> или > | GreaterThan | Больше чем. Если вы используете > при определении условия в пользовательском интерфейсе Edge, оно преобразуется в >. |
>= или >= | GreaterThanOrEquals | Больше или равно. Если вы используете >= при определении условия в пользовательском интерфейсе Edge, оно преобразуется в >=. |
< | LesserThan | Меньше, чем. Пользовательский интерфейс Edge не поддерживает буквальный <. |
<= | LesserThanOrEquals | Меньше или равно. Пользовательский интерфейс Edge не поддерживает литерал <=. |
&& | And , and | И |
|| | Or | Оператор Or не чувствителен к регистру. Например, допустимы все операторы OR , Or и or . |
() | Группирует выражение. ( открывает выражение и ) закрывает его. | |
~~ | JavaRegex | Соответствует регулярному выражению, совместимому с |
~ | 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) показанного операнда:
Оператор | левая шкала нуль | правая шкала нулевая | Левая и правая ноль |
---|---|---|---|
= , == , := | ЛОЖЬ | ЛОЖЬ | истинный |
=| | ЛОЖЬ | ЛОЖЬ | ЛОЖЬ |
!= | истинный | истинный | ЛОЖЬ |
> или > | истинный | ЛОЖЬ | ЛОЖЬ |
>= или >= | ЛОЖЬ | истинный | истинный |
< | истинный | ЛОЖЬ | ЛОЖЬ |
<= | истинный | ЛОЖЬ | истинный |
~ | ЛОЖЬ | Н/Д | ЛОЖЬ |
~~ | ЛОЖЬ | Н/Д | ЛОЖЬ |
!~ | истинный | ЛОЖЬ | ЛОЖЬ |
~/ | ЛОЖЬ | Н/Д | ЛОЖЬ |
Литералы
Помимо строковых и числовых литералов, в условных операторах можно использовать следующие литералы:
-
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>