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