Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Что
Правило ExtractVariables извлекает контент из запроса или ответа и присваивает его значение переменной. Вы можете извлечь любую часть сообщения, включая заголовки, пути URI, полезные нагрузки JSON/XML, параметры формы и параметры запроса. Правило работает, применяя текстовый шаблон к содержимому письма. Если шаблон совпадает с содержимым, правило задает переменную с указанным содержимым письма.
Хотя чаще всего это правило используется для извлечения информации из запроса или сообщения ответа, его также можно применять для извлечения информации из других источников, включая объекты, созданные правилом AccessEntity, объекты XML или объекты JSON.
После извлечения указанного контента сообщения вы можете ссылаться на переменную в других правилах при обработке запроса и ответа.
Видео
Чтобы узнать больше о правиле ExtractVariables, посмотрите следующие видео:
| Видео | Описание |
|---|---|
| Извлечение переменных из полезной нагрузки XML | Извлекайте переменные из полезной нагрузки XML с помощью правила Extract Variable. |
| Извлечение переменных из полезной нагрузки JSON | Извлекайте переменные из полезной нагрузки JSON с помощью правила Extract Variable. |
| Извлечение переменных из параметров | Извлекать переменные из параметров, например параметров запроса, заголовка, формы или URI. |
| Извлечение переменных из параметров с несколькими значениями | Извлекать переменные из параметров с несколькими значениями. |
| Извлечение переменных из параметра запроса (классическая версия Edge) | Как извлечь переменные из параметра запроса с помощью классического интерфейса Edge |
| Извлечение переменных из полезной нагрузки XML или JSON (классическая версия Edge) | Как извлечь переменные из полезной нагрузки XML или JSON с помощью классического интерфейса Edge |
Примеры
В этих примерах кода показано, как извлекать переменные из следующих типов артефактов:
GitHub
Эти ссылки ведут на рабочие примеры прокси-серверов API, которые можно развернуть и запустить в Edge. Они используют ExtractVariables и находятся в репозитории api-platform-samples на GitHub. В файлах README объясняется, как используется ExtractVariables в каждом случае, а также как развернуть и запустить каждый пример.
- Пример извлечения и назначения переменных (извлечение данных из сообщений JSON и XML)
- Пример объекта Access
- Пример разбивки на страницы и кеширования
- Перенаправление целевого URL
- Пример комбинирования правил
URI
<ExtractVariables name="ExtractVariables-1">
<DisplayName>Extract a portion of the url path</DisplayName>
<Source>request</Source>
<URIPath>
<Pattern ignoreCase="true">/accounts/{id}</Pattern>
</URIPath>
<VariablePrefix>urirequest</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Рассмотрим приведенный выше образец кода правил. Элемент <URIPath> указывает правилу ExtractVariables извлечь информацию из пути URI. Элемент <Pattern> задает шаблон, который применяется к пути URI. Шаблон рассматривается как простой шаблон, а фигурные скобки обозначают изменяемую часть пути URI.
Название переменной, которую нужно задать, определяется значением, указанным в элементе <VariablePrefix>, а также значением, заключенным в фигурные скобки {} в элементе <Pattern>. Два значения объединяются точкой, в результате чего получается название переменной, например urirequest.id. Если элемента <VariablePrefix> нет, то название переменной – это значение, заключенное в фигурные скобки.
Предположим, что приведенный выше код правила работает со следующим входящим запросом:
GET http://org1-test.apigee.net/svc1/accounts/12797282
Предположим, что базовый путь для прокси API – /svc1. Когда Apigee Edge применяет к входящему запросу приведенный выше код правила ExtractVariables, переменной urirequest.id присваивается значение 12797282. После того как Apigee Edge выполнит правило, последующие правила или код в процессе обработки смогут ссылаться на переменную urirequest.id, чтобы получить строковое значение 12797282.
Например, следующее правило AssignMessage встраивает значение этой переменной в полезную нагрузку нового запроса:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AssignPayload"> <DisplayName>AssignPayload</DisplayName> <Set> <Payload contentType="text/xml"> <IdExtractedFromURI>{urirequest.id}</IdExtractedFromURI> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo> </AssignMessage>
Параметры запроса
<ExtractVariables name="ExtractVariables-2">
<DisplayName>Extract a value from a query parameter</DisplayName>
<Source>request</Source>
<QueryParam name="code">
<Pattern ignoreCase="true">DBN{dbncode}</Pattern>
</QueryParam>
<VariablePrefix>queryinfo</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Предположим, что приведенный выше код правила работает со следующим входящим запросом:
GET http://org1-test.apigee.net/accounts/12797282?code=DBN88271
Когда Apigee Edge применяет к входящему запросу код правила ExtractVariables, приведенный выше, переменной queryinfo.dbncode присваивается значение 88271. После того как Apigee Edge выполнит правило, последующие правила или код в процессе обработки могут ссылаться на переменную с именем queryinfo.dbncode, чтобы получить строковое значение 88271.
Теперь в прокси-сервере можно использовать переменную queryinfo.dbncode.
Например, следующая политика AssignMessage копирует его в полезную нагрузку запроса:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetQP</DisplayName> <Set> <Payload contentType="text/xml"> <ExtractQP>{queryinfo.dbncode}</ExtractQP> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Несколько параметров
<ExtractVariables name="ExtractVariables-2">
<DisplayName>Extract a value from a query parameter</DisplayName>
<Source>request</Source>
<QueryParam name="w">
<Pattern ignoreCase="true">{firstWeather}</Pattern>
</QueryParam>
<QueryParam name="w.2">
<Pattern ignoreCase="true">{secondWeather}</Pattern>
</QueryParam>
<VariablePrefix>queryinfo</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Предположим, что в вашем API можно указать несколько параметров запроса с одним и тем же названием. Это правило позволяет извлекать значения нескольких экземпляров параметра запроса "w". Чтобы ссылаться на эти параметры запроса в правиле ExtractVariables, используйте индексы. Первый экземпляр параметра запроса не имеет индекса, второй – индекс 2, третий – индекс 3 и т. д.
Предположим, что приведенный выше код правила работает со следующим входящим запросом:
GET http://org1-test.apigee.net/weather?w=Boston&w=Chicago
Когда Apigee Edge применяет к этому входящему запросу код правила ExtractVariables, приведенный выше, он присваивает переменной queryinfo.firstWeather значение Boston, а переменной queryInfo.secondWeather – значение Chicago.
Теперь в прокси-сервере можно использовать переменную queryinfo.firstWeather и queryinfo.secondWeather. Например, следующая политика AssignMessage копирует его в полезную нагрузку запроса:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetQP</DisplayName> <Set> <Payload contentType="text/xml"> <ExtractQP1>{queryinfo.firstWeather}</ExtractQP1> <ExtractQP2>{queryinfo.secondWeather}</ExtractQP2> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
заголовки;
<ExtractVariables name='ExtractVariable-OauthToken'>
<Source>request</Source>
<Header name="Authorization">
<Pattern ignoreCase="false">Bearer {oauthtoken}</Pattern>
</Header>
<VariablePrefix>clientrequest</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Предположим, что ваш API использует токены OAuth версии 2.0. Предположим, что приведенный выше код правил работает с запросом, содержащим токен OAuth версии 2.0 с заголовком следующего вида:
Authorization: Bearer TU08xptfFfeM7aS0xHqlxTgEAdAM.
Предположим, что вы как разработчик API хотите использовать значение токена (но не весь заголовок) в качестве ключа для поиска в кеше. Вы можете использовать приведенный выше код правила ExtractVariables, чтобы извлечь токен.
Когда Apigee Edge применяет к этому заголовку код правила ExtractVariables, описанный выше, переменной clientrequest.oauthtoken присваивается значение TU08xptfFfeM7aS0xHqlxTgEAdAM.
Теперь в прокси-сервере можно использовать переменную clientrequest.oauthtoken. Например, следующая политика AssignMessage копирует его в полезную нагрузку запроса:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetHeader</DisplayName> <Set> <Payload contentType="text/xml"> <ExtractHeader>{clientrequest.oauthtoken}</ExtractHeader> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
JSON
<ExtractVariables name="ExtractVariables-3"> <Source>response</Source> <JSONPayload> <Variable name="latitude" type="float"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude" type="float"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> <VariablePrefix>geocoderesponse</VariablePrefix> </ExtractVariables>
<JSONPayload>$
Рассмотрим следующую полезную нагрузку ответа JSON:
{ "results": [{ "geometry": { "location": { "lat": 37.42291810, "lng": -122.08542120 }, "location_type": "ROOFTOP", "viewport": { "northeast": { "lat": 37.42426708029149, "lng": -122.0840722197085 }, "southwest": { "lat": 37.42156911970850, "lng": -122.0867701802915 } } } }] }
Когда Apigee Edge применяет к этому сообщению JSON код правил ExtractVariables, описанный выше, он задает две переменные: geocoderesponse.latitude и geocoderesponse.longitude. Обе переменные используют один и тот же префикс geocoderesponse. Суффикс для этих переменных задается явным образом с помощью атрибута name элемента <Variable>.
Переменная geocoderesponse.latitude получает значение 37.42291810. Переменная geocoderesponse.longitude получает значение -122.08542120.
Теперь в прокси-сервере можно использовать переменную geocoderesponse.latitude. Например, следующее правило AssignMessage копирует его в заголовок с именем latitude в ответе:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetJSONVar</DisplayName> <Add> <Headers> <Header name="latitude">{geocoderesponse.latitude}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
XML
<ExtractVariables name="ExtractVariables-4"> <Source>response</Source> <XMLPayload> <Namespaces> <Namespace prefix="dir">urn:43BFF88D-D204-4427-B6BA-140AF393142F</Namespace> </Namespaces> <Variable name="travelmode" type="string"> <XPath>/dir:Directions/dir:route/dir:leg/dir:step/@mode</XPath> </Variable> <Variable name="duration" type="string"> <XPath>/dir:Directions/dir:route/dir:leg/dir:step/dir:duration/dir:value</XPath> </Variable> <Variable name="timeunit" type="string"> <XPath>/dir:Directions/dir:route/dir:leg/dir:step/dir:duration/dir:text</XPath> </Variable> </XMLPayload> <VariablePrefix>directionsresponse</VariablePrefix> </ExtractVariables>
<XMLPayload>
Рассмотрим следующий ответ в формате XML:
<Directions xmlns="urn:43BFF88D-D204-4427-B6BA-140AF393142F">
<status>OK</status>
<route>
<summary>I-40 W</summary>
<leg>
<step mode="DRIVING">
<start_location>
<lat>41.8507300</lat>
<lng>-87.6512600</lng>
</start_location>
<end_location>
<lat>41.8525800</lat>
<lng>-87.6514100</lng>
</end_location>
<duration>
<value>19</value>
<text>minutes</text>
</duration>
</step>
</leg>
</route>
</Directions>Когда Apigee Edge применяет к этому XML-сообщению код правила ExtractVariables, описанный выше, он задает три переменные: directionsresponse.travelmode,, directionsresponse.duration и directionsresponse.timeunit. Все переменные используют один и тот же префикс directionsresponse. Суффикс для этих переменных задается явным образом с помощью атрибута name элемента <Variable>.
Переменная directionsresponse.travelmode получает значение DRIVING. Переменная directionsresponse.duration получает значение 19. Переменная directionsresponse.timeunit получает значение minutes.
Теперь в прокси-сервере можно использовать переменную directionresponse.travelmode. Например, следующее правило AssignMessage копирует его в заголовок с названием "tmode" в ответе:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetXMLVar</DisplayName> <Add> <Headers> <Header name="tmode">{directionsresponse.travelmode}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Правило ExtractVariables
Разработчики API создают прокси API, которые ведут себя по-разному в зависимости от содержания сообщений, включая заголовки, пути URI, полезную нагрузку и параметры запроса. Часто прокси-сервер извлекает часть этого контента для использования в условии. Для этого используйте правило ExtractVariables.
При определении правила ExtractVariables можно выбрать:
- Названия переменных, которые нужно задать.
- Источник переменных
- Сколько переменных нужно извлечь и задать
При выполнении правило применяет к контенту текстовый шаблон и, если находит совпадение, задает значение указанной переменной. Другие правила и код могут использовать эти переменные, чтобы обеспечить динамическое поведение или отправлять коммерческие данные в Edge API Analytics.
Чтобы узнать, как с помощью ExtractVariables создавать отчеты Аналитики на основе контента, ознакомьтесь со статьей Как анализировать контент сообщений API с помощью специальной аналитики.
Область действия
Переменные, заданные с помощью правила ExtractVariables, имеют глобальную область действия. Это означает, что после того, как правило ExtractVariables определит новую переменную, вы сможете получить доступ к этой переменной из любого правила или кода на любом этапе потока (который выполняется после правила ExtractVariables). К ним относятся:
- PreFlow: ProxyEndpoint и TargetEndpoint (запрос и ответ)
- PostFlow: ProxyEndpoint и TargetEndpoint (запрос и ответ)
- PostClientFlow: ProxyEndpoint (только ответ, с использованием правила регистрации сообщений)
- Карта ошибок
Сопоставление и создание переменных
Правило ExtractVariables извлекает информацию из запроса или ответа и записывает ее в переменную. Для каждого типа информации, которую можно извлечь, например пути URI или данных XML, вы указываете шаблон для сопоставления и название переменной, которая будет использоваться для хранения извлеченной информации.
Однако принцип работы сопоставления с шаблоном зависит от источника извлечения. В следующих разделах описаны две основные категории информации, которую можно извлечь.
Сопоставление путей URI, параметров запроса, заголовков, параметров формы и переменных
При извлечении информации из пути URI, параметров запроса, заголовков, параметров формы и переменных вы используете тег <Pattern>, чтобы указать один или несколько шаблонов для сопоставления. Например, в следующем примере правил показан один шаблон для пути URI:
<ExtractVariables name="ExtractVariables-1">
<Source>request</Source>
<URIPath>
<Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
</URIPath>
<VariablePrefix>urirequest</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>В этом примере переменная urirequest.pathSeg устанавливается в значение, которое появляется в proxy.pathsuffix после "/a/". Предположим, базовый путь для вашего прокси API – /basepath/v1 . При входящем запросе к http://myCo.com/basepath/v1/a/b переменная будет иметь значение "b".
Как указать несколько шаблонов
Вы можете указать несколько шаблонов для сопоставления, соответствующих тегам <Pattern>, где:
- Все шаблоны проверяются на соответствие.
- Если ни один из шаблонов не совпадает, правило не выполняется и переменные не создаются.
- Если совпадений несколько, для извлечения данных используется шаблон с самым длинным сегментом пути.
- Если у двух подходящих шаблонов одинаковые самые длинные сегменты пути, для извлечения используется шаблон, указанный в правиле первым.
В следующем примере создается правило, содержащее три шаблона для пути URI:
<ExtractVariables name="ExtractVariables-1">
<Source>request</Source>
<URIPath>
<Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
<Pattern ignoreCase="true">/a/b/{pathSeg}</Pattern>
<Pattern ignoreCase="true">/a/b/c/{pathSeg}</Pattern>
</URIPath>
<VariablePrefix>urirequest</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Предположим, для прокси API с базовым путем /basepath/v1 входящий URL запроса к прокси API имеет следующий вид:
http://myCo.com/basepath/v1/a/b
В этом примере первый шаблон соответствует URI, и переменной urirequest.pathSeg присваивается значение "b".
Если URL запроса:
http://myCo.com/basepath/v1/a/b/c/d
…тогда будет найдено соответствие третьему шаблону, и переменной urirequest.pathSeg будет присвоено значение "d".
Как задавать шаблоны с несколькими переменными
В шаблоне соответствия можно указать несколько переменных. Например, вы задаете шаблон соответствия с двумя переменными:
<ExtractVariables name="ExtractVariables-1">
<Source>request</Source>
<URIPath>
<Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
<Pattern ignoreCase="true">/a/b/{pathSeg}</Pattern>
<Pattern ignoreCase="true">/a/{pathSeg1}/c/{pathSeg2}</Pattern>
</URIPath>
<VariablePrefix>urirequest</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Предположим , что прокси API имеет базовый путь /basepath/v1. Тогда для входящего запроса URL будет выглядеть так:
http://myCo.com/basepath/v1/a/b/c/d
…переменной urirequest.pathSeg1 присваивается значение "b", а переменной urirequest.pathSeg2 – значение "d".
Сопоставление нескольких экземпляров в шаблоне
Вы также можете сопоставлять шаблоны, если у нескольких объектов одинаковые названия. Например, вы можете отправить запрос, содержащий несколько параметров запроса или несколько заголовков с одинаковым названием. В следующем запросе два параметра запроса с названием "w":
http://myCo.com/basepath/v1/a/b/c/d?w=1&w=2
Чтобы ссылаться на эти параметры запроса в правиле ExtractVariables, используйте индексы. Первый экземпляр параметра запроса не имеет индекса, второй – индекс 2, третий – индекс 3 и т. д. Например, следующее правило извлекает значение второго параметра запроса с именем "w" в запросе:
<ExtractVariables name="ExtractVariables-1">
<Source>request</Source>
<QueryParam name="w.2">
<Pattern ignoreCase="true">{secondW}</Pattern>
</QueryParam>
<VariablePrefix>urirequest</VariablePrefix>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>Переменной urirequest.secondW присвоено значение "2". Если второй параметр запроса отсутствует в запросе, то переменная urirequest.secondW будет пустой. Используйте индексацию, если в запросе есть несколько объектов с одинаковыми названиями.
Использование специальных символов в шаблоне
При сопоставлении путей URI в шаблоне можно использовать подстановочные знаки "*" и "**", где:
- "*" соответствует любому сегменту пути.
- "**" соответствует нескольким сегментам пути
Например, вы можете указать шаблоны для элемента <URIPath>, как показано ниже:
<URIPath>
<Pattern ignoreCase="true">/a/*/{id}</Pattern>
<Pattern ignoreCase="true">/a/**/{id}</Pattern>
</URIPath>Первый шаблон соответствует запросам с суффиксами пути (часть пути URI после базового пути), например "/a/b/c", "/a/foo/bar" и т. д. Второй шаблон соответствует любому количеству сегментов пути после "/a/", например "/a/foo/bar/baz/c", а также "/a/b/c" и "/a/foo/bar".
При указании шаблонов для параметров запроса, заголовков и параметров формы символ "*" означает, что нужно сопоставить любое количество символов. Например, чтобы сопоставить заголовок, укажите шаблон следующим образом:
*;charset={encoding}
Этот шаблон соответствует значениям "text/xml;charset=UTF-16" и "application/xml;charset=ASCII".
Если значение, переданное правилу ExtractVariables, содержит специальный символ, например "{", используйте символ "%" для его экранирования. В следующем примере символы "{" и "}" в шаблоне экранируются, поскольку они используются как литеральные символы в значении параметра запроса:
<QueryParam>
<Pattern ignoreCase="true">%{user%} {name}</Pattern>
</QueryParam>В этом примере шаблон соответствует значению "{user} Steve", но не значению "user Steve".
Сопоставление JSON и XML
При извлечении данных из JSON и XML в правилах указываются один или несколько тегов <Variable>. Тег <Variable> задает название целевой переменной, в которой хранится извлеченная информация, а также JsonPath (JSON) или XPATH (XML) для извлеченной информации.
Все теги <Variable> в правиле оцениваются, поэтому вы можете заполнить несколько переменных из одного правила. Если тег <Variable> не соответствует допустимому полю в JSON или XML, то соответствующая переменная не создается.
В следующем примере показано правило ExtractVariables, которое заполняет две переменные из тела ответа в формате JSON:
<ExtractVariables name="ExtractVariables-3"> <Source>response</Source> <JSONPayload> <Variable name="latitude" type="float"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude" type="float"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> <VariablePrefix>geocoderesponse</VariablePrefix> </ExtractVariables>
Запись в одну и ту же переменную в нескольких местах
Будьте внимательны при выборе названий переменных. Правило выполняется последовательно, от первого шаблона извлечения до последнего. Если правило записывает значение в одну и ту же переменную из нескольких мест, значение переменной определяется последней записью в правиле. (Возможно, это то, что вам нужно.)
Например, вы хотите извлечь значение токена, которое может быть передано в параметре запроса или в заголовке, как показано ниже:
<!-- If token only in query param, the query param determines the value.
If token is found in both the query param and header, header sets value. -->
<QueryParam name="token">
<Pattern ignoreCase="true">{tokenValue}</Pattern>
</QueryParam>
<!-- Overwrite tokenValue even if it was found in query parameter. -->
<Header name="Token">
<Pattern ignoreCase="true">{tokenValue}</Pattern>
</Header>Как управлять действиями, выполняемыми при отсутствии совпадений
Если шаблон не совпадает, соответствующая переменная не создается. Поэтому, если на переменную ссылается другое правило, может возникнуть ошибка.
Один из вариантов – задать для <IgnoreUnresolvedVariables> значение true в правиле, которое ссылается на переменную, чтобы правило обрабатывало любую неразрешимую переменную как пустую строку (null):
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
Сведения об элементах
В справочнике по элементам описаны элементы и атрибуты правила ExtractVariables.
<ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract-Variables-1"> <DisplayName>Extract Variables 1</DisplayName> <Source clearPayload="true|false">request</Source> <VariablePrefix>myprefix</VariablePrefix> <IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables> <URIPath> <Pattern ignoreCase="false">/accounts/{id}</Pattern> </URIPath> <QueryParam name="code"> <Pattern ignoreCase="true">DBN{dbncode}</Pattern> </QueryParam> <Header name="Authorization"> <Pattern ignoreCase="false">Bearer {oauthtoken}</Pattern> </Header> <FormParam name="greeting"> <Pattern>hello {user}</Pattern> </FormParam> <Variable name="request.content"> <Pattern>hello {user}</Pattern> </Variable> <JSONPayload> <Variable name="name"> <JSONPath>{example}</JSONPath> </Variable> </JSONPayload> <XMLPayload stopPayloadProcessing="false"> <Namespaces/> <Variable name="name" type="boolean"> <XPath>/test/example</XPath> </Variable> </XMLPayload> </ExtractVariables>
Атрибуты <ExtractVariables>
<ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract-Variables-1">
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
Элемент <Source>
(Необязательно) Указывает переменную, которую нужно проанализировать. Значение свойства <Source> по умолчанию – message. Значение message зависит от контекста. В потоке запроса message преобразуется в сообщение запроса. В цепочке ответов message преобразуется в ответное сообщение.
Хотя это правило часто используется для извлечения информации из запроса или сообщения ответа, его можно применять для извлечения информации из любой переменной. Например, с его помощью можно извлечь информацию из объекта, созданного правилом AccessEntity, из данных, возвращенных правилом Service Callout, или из объекта XML или JSON.
Если <Source> не удается разрешить или он разрешается в тип, отличный от типа сообщения, правило не будет отвечать.
<Source clearPayload="true|false">request</Source>
| По умолчанию: | Сообщение |
| Присутствие | Необязательно |
| Тип: | Строка |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| clearPayload |
Установите значение true, если вы хотите очистить полезную нагрузку, указанную в элементе <Source>, после извлечения из нее данных. |
false |
Необязательно | Логическое значение |
Элемент <VariablePrefix>
(Необязательно.) Полное название переменной создается путем объединения <VariablePrefix>, точки и названия, которое вы задаете в фигурных скобках в элементе <Pattern> или <Variable>. Примеры: myprefix.id, myprefix.dbncode или myprefix.oauthtoken..
<VariablePrefix>myprefix</VariablePrefix>
Предположим, что значение параметра name – "user".
- Если
<VariablePrefix>не указано, извлеченные значения присваиваются переменной с именемuser. - Если в качестве значения
<VariablePrefix>указан префикс myprefix, извлеченные значения будут присвоены переменнойmyprefix.user.
| По умолчанию: | Н/Д |
| Присутствие | Необязательно |
| Тип: | Строка |
Элемент <IgnoreUnresolvedVariables>
Если задать значение true, все неразрешимые переменные будут рассматриваться как пустые строки (null). Установите значение false, если хотите, чтобы при невозможности разрешить любую из указанных переменных правило выдавало ошибку.
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
| По умолчанию: | False |
| Присутствие | Необязательно |
| Тип: | Логическое значение |
Если ссылка XPath не разрешена в <XMLPayload>, правило выдает следующую ошибку:
{ "fault":{ "faultstring":"Unresolved xpath path in policy policy_name.", "detail":{ "errorcode":"steps.extractvariables.InvalidXPath" } } }
Элемент <URIPath>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Извлекает значение из proxy.pathsuffix исходного сообщения request. Путь, применяемый к шаблону, – это proxy.pathsuffix, который не включает basepath для прокси API. Если исходное сообщение относится к типу response, этот элемент не выполняет никаких действий.
<URIPath>
<Pattern ignoreCase="false">/accounts/{id}</Pattern>
</URIPath>Можно использовать несколько элементов <Pattern>:
<URIPath>
<Pattern ignoreCase="false">/accounts/{id}</Pattern>
<Pattern ignoreCase="false">/accounts/{id}/transactions/{index}</Pattern>
</URIPath>| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| ignoreCase | Указывает, что при сопоставлении с шаблоном регистр не учитывается. |
false |
Необязательно | Логическое значение |
Элемент <QueryParam>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Извлекает значение из указанного параметра запроса исходного сообщения запроса. Если исходное сообщение относится к типу response, этот элемент не выполняет никаких действий.
<QueryParam name="code">
<Pattern ignoreCase="true">DBN{dbncode}</Pattern>
</QueryParam>Если у нескольких параметров запроса одинаковые названия, используйте индексы, чтобы ссылаться на параметры:
<QueryParam name="w.2">
<Pattern ignoreCase="true">{secondW}</Pattern>
</QueryParam>| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name | Указывает название параметра запроса. Если у нескольких параметров запроса одинаковые названия, используйте индексированные ссылки. В этом случае у первого параметра запроса нет индекса, у второго – индекс 2, у третьего – индекс 3 и т. д. |
Н/Д |
Обязательно | Строка |
Элемент <Header>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Извлекает значение из указанного заголовка HTTP указанного запроса или ответа. Если у нескольких заголовков одно и то же название, их значения хранятся в массиве.
<!-- The name is the actual header name. --> <Header name="Authorization"> <!-- Provide a name for your new custom variable here. --> <Pattern ignoreCase="false">Bearer {oauthtoken}</Pattern> </Header>
Если у нескольких заголовков одинаковые названия, используйте индексы, чтобы ссылаться на отдельные заголовки в массиве:
<Header name="myHeader.2">
<Pattern ignoreCase="true">{secondHeader}</Pattern>
</Header>Или следующий код, чтобы перечислить все заголовки в массиве:
<Header name="myHeader.values">
<Pattern ignoreCase="true">{myHeaders}</Pattern>
</Header>| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name | Указывает название заголовка, из которого извлекается значение. Если у нескольких заголовков одинаковые названия, используйте индексированные ссылки. В этом случае первый экземпляр заголовка не имеет индекса, второй имеет индекс 2, третий – 3 и т. д. Чтобы получить все заголовки в массиве, используйте .values. |
Н/Д |
Обязательно | Строка |
Элемент <FormParam>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Извлекает значение из указанного параметра формы в указанном сообщении запроса или ответа. Параметры формы можно извлечь, только если заголовок Content-Type указанного письма имеет значение application/x-www-form-urlencoded.
<FormParam name="greeting">
<Pattern>hello {user}</Pattern>
</FormParam>| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name | Название параметра формы, из которого извлекается значение. |
Н/Д |
Обязательно | Строка |
Элемент <Variable>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Указывает название переменной, из которой нужно извлечь значение.
<Variable name="myVar">
<Pattern>hello {user}</Pattern>
</Variable>Чтобы извлечь из переменной два значения:
<Variable name="myVar">
<Pattern>hello {firstName} {lastName}</Pattern>
</Variable>| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name | Название переменной, из которой нужно извлечь значение. |
Н/Д |
Обязательно | Строка |
Элемент <JSONPayload>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Указывает сообщение в формате JSON, из которого будет извлечено значение переменной. Извлечение JSON выполняется только в том случае, если заголовок Content-Type сообщения имеет значение application/json.
<JSONPayload> <Variable name="name" type="string"> <JSONPath>{example}</JSONPath> </Variable> </JSONPayload>
| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Элемент <JSONPayload>/<Variable>
(Обязательный элемент в JSONPayload.) Указывает переменную, которой присваивается извлеченное значение. Чтобы заполнить несколько переменных, в элемент <JSONPayload> можно добавить несколько тегов <Variable>.
<Variable name="name" type="string"> <JSONPath>{example}</JSONPath> </Variable>
| По умолчанию: | Н/Д |
| Присутствие | Обязательный элемент в JSONPayload. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name |
Указывает название переменной, которой будет присвоено извлеченное значение. |
name |
Обязательно | Строка |
| тип | Указывает тип данных значения переменной. | Н/Д | Необязательно |
Строка. Доступные варианты:
|
Элемент <JSONPayload>/<Variable>/<JSONPath>
(Обязательный элемент в JSONPayload:Variable.) Указывает путь JSON, используемый для извлечения значения из сообщения в формате JSON.
<Variable name="name"> <JSONPath>$.rss.channel.title</JSONPath> </Variable>
| По умолчанию: | Н/Д |
| Присутствие | Обязательно |
| Тип: | Строка |
Элемент <XMLPayload>
(Необязательно, но ознакомьтесь с информацией в строке "Присутствие" в таблице ниже.) Указывает сообщение в формате XML, из которого будет извлечено значение переменной. Полезные данные XML извлекаются только в том случае, если заголовок Content-Type сообщения имеет значение text/xml, application/xml или application/*+xml.
<XMLPayload stopPayloadProcessing="false"> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> <Namespace prefix="gmail">http://mail.google.com</Namespace> </Namespaces> <Variable name="name" type="boolean"> <XPath>/apigee:test/apigee:example</XPath> </Variable> </XMLPayload>
| По умолчанию: | Н/Д |
| Присутствие | Необязательное поле. Однако вы должны включить хотя бы один из следующих элементов: <URIPath>, <QueryParam>, <Header>, <FormParam>, <JSONPayload> или <XMLPayload>.. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
stopPayloadProcessing |
Установите значение |
false |
Необязательно | Логическое значение |
Элемент <XMLPayload>/<Namespaces>
(Необязательно.) Указывает пространство имен, которое будет использоваться при оценке XPath. Если в выражениях XPath используются пространства имен, их необходимо объявить здесь, как показано в примере ниже.
<XMLPayload stopPayloadProcessing="false"> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> <Namespace prefix="gmail">http://mail.google.com</Namespace> </Namespaces> <Variable name="legName" type="string"> <XPath>/apigee:Directions/apigee:route/apigee:leg/apigee:name</XPath> </Variable> </XMLPayload>
Если в выражениях XPath не используются пространства имен, элемент <Namespaces> можно удалить или закомментировать, как показано в следующем примере:
<XMLPayload stopPayloadProcessing="false"> <!-- <Namespaces/> --> <Variable name="legName" type="string"> <XPath>/Directions/route/leg/name</XPath> </Variable> </XMLPayload>
| По умолчанию: | Н/Д |
| Присутствие | Необязательно |
| Тип: | Строка |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
prefix |
Префикс пространства имен. |
Н/Д |
Обязательно | Строка |
Элемент <XMLPayload>/<Variable>
Необязательный параметр, позволяющий указать переменную, которой будет присвоено извлеченное значение.
<Variable name="name" type="boolean"> <XPath>/test/example</XPath> </Variable>
| По умолчанию: | Н/Д |
| Присутствие | Необязательно |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name |
Указывает название переменной, которой будет присвоено извлеченное значение. |
name |
Обязательно | Строка |
| тип | Указывает тип данных значения переменной. | Логическое значение | Необязательно |
Строка. Доступные варианты:
|
Элемент <XMLPayload>/<Variable>/<XPath>
(Обязательный элемент в XMLPayload:Variable.) Указывает XPath, определенный для переменной. Поддерживаются только выражения XPath 1.0.
<Variable name="name" type="boolean"> <XPath>/test/example</XPath> </Variable>
Пример с пространством имен Если в выражениях XPath используются пространства имен, их необходимо объявить в разделе <XMLPayload><Namespaces> правил.
<Variable name="name" type="boolean"> <XPath>/foo:test/foo:example</XPath> </Variable>
| По умолчанию: | Н/Д |
| Присутствие | Обязательно |
| Тип: | Строка |
Справочник по ошибкам
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые задаются Edge, когда это правило вызывает ошибку. Эта информация важна, если вы разрабатываете правила обработки ошибок. Подробнее о том, что нужно знать об ошибках в правилах и об обработке ошибок…
Ошибки времени выполнения
Эти ошибки могут возникать при выполнении правил.
| Код ошибки | Статус HTTP | Причина | Исправить |
|---|---|---|---|
steps.extractvariables.ExecutionFailed |
500 |
Эта ошибка возникает в следующих случаях:
|
build |
steps.extractvariables.ImmutableVariable |
500 | Переменная, используемая в правиле, неизменяема. Правило не смогло задать эту переменную. | |
steps.extractvariables.InvalidJSONPath |
500 | Эта ошибка возникает, если в элементе JSONPath правила используется недопустимый путь JSON. Например, если в полезной нагрузке JSON нет объекта Name, но вы указали Name в качестве пути в правиле, возникнет эта ошибка. |
build |
steps.extractvariables.JsonPathParsingFailure |
500 | Эта ошибка возникает, когда правилу не удается обработать путь JSON и извлечь данные из переменной потока, указанной в элементе Source. Обычно это происходит, если переменная потока, указанная в элементе Source, не существует в текущем потоке. |
build |
steps.extractvariables.SetVariableFailed |
500 | Эта ошибка возникает, если правилу не удалось задать значение для переменной. Эта ошибка обычно возникает, если вы пытаетесь присвоить значения нескольким переменным, названия которых начинаются с одних и тех же слов вложенного формата с точками. | build |
steps.extractvariables.SourceMessageNotAvailable |
500 | Эта ошибка возникает, если переменная message, указанная в элементе Source правила, является:
|
build |
steps.extractvariables.UnableToCast |
500 | Эта ошибка возникает, если правило не может преобразовать извлеченное значение в переменную. Обычно это происходит, когда вы пытаетесь присвоить переменной одного типа данных значение другого типа. | build |
Ошибки развертывания
Эти ошибки могут возникать при развертывании прокси-сервера, содержащего это правило.
| Название ошибки | Причина | Исправить |
|---|---|---|
NothingToExtract |
Если в правиле нет элементов URIPath, QueryParam, Header, FormParam, XMLPayload или JSONPayload, развертывание прокси API завершится неудачно, поскольку извлекать будет нечего. |
build |
NONEmptyPrefixMappedToEmptyURI |
Эта ошибка возникает, если в правиле определен префикс в элементе Namespace под элементом XMLPayload, но не определен URI. |
build |
DuplicatePrefix |
Эта ошибка возникает, если в элементе Namespace в элементе XMLPayload префикс правила определен более одного раза. |
build |
NoXPathsToEvaluate |
Если в элементе XMLPayload нет элемента XPath, развертывание прокси-сервера API завершится с ошибкой.
|
build |
EmptyXPathExpression |
Если в правиле есть пустое выражение XPath в элементе XMLPayload, развертывание прокси-сервера API завершится неудачно. |
build |
NoJSONPathsToEvaluate |
Если в элементе JSONPayload нет элемента JSONPath, развертывание прокси-сервера API завершится с ошибкой. |
build |
EmptyJSONPathExpression |
Если в правиле есть пустое выражение XPath в элементе XMLPayload, развертывание прокси-сервера API завершится неудачно. |
build |
MissingName |
Если в каком-либо элементе правил, например QueryParam, Header, FormParam или Variable, отсутствует атрибут name, то развертывание прокси-сервера API завершится неудачно. |
build |
PatternWithoutVariable |
Если в элементе Pattern правила не указана переменная, развертывание прокси-сервера API завершится неудачно. Элементу Pattern требуется название переменной, в которой будут храниться извлеченные данные. |
build |
CannotBeConvertedToNodeset |
Если в правиле есть выражение XPath, в котором тип Variable определен как nodeset, но выражение нельзя преобразовать в nodeset, развертывание прокси-сервера API завершится неудачно. |
build |
JSONPathCompilationFailed |
Правило не может скомпилировать указанный путь JSON. | |
InstantiationFailed |
Не удалось создать экземпляр правила. | |
XPathCompilationFailed |
Если префикс или значение, используемое в элементе XPath, не входит ни в одно из объявленных в правиле пространств имен, развертывание прокси-сервера API завершится неудачно. |
build |
InvalidPattern |
Если определение элемента Pattern недействительно в каком-либо из элементов, например URIPath, QueryParam, Header, FormParam, XMLPayload или JSONPayload, в правиле, развертывание прокси-сервера API завершится неудачей.
|
build |
Переменные ошибок
Эти переменные задаются, когда правило вызывает ошибку во время выполнения. Подробнее о нарушениях правил…
| Переменные | Место | Пример |
|---|---|---|
fault.name="fault_name" |
fault_name – название ошибки, указанное в таблице Ошибки выполнения выше. Название ошибки – это последняя часть кода ошибки. | fault.name = "SourceMessageNotAvailable" |
extractvariables.policy_name.failed |
policy_name – заданное пользователем название правила, которое вызвало ошибку. | extractvariables.EV-ParseJsonResponse.failed = true |
Пример ответа об ошибке
{ "fault":{ "detail":{ "errorcode":"steps.extractvariables.SourceMessageNotAvailable" }, "faultstring":"request message is not available for ExtractVariable: EV-ParseJsonResponse" } }
Пример правила обработки ошибок
<FaultRule name="Extract Variable Faults"> <Step> <Name>AM-CustomErrorMessage</Name> <Condition>(fault.name = "SourceMessageNotAvailable") </Condition> </Step> <Condition>(extractvariables.EM-ParseJsonResponse.failed = true) </Condition> </FaultRule>
Схемы
Статьи по теме
Анализ содержимого сообщений API с помощью специальной аналитики