Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Что
Политика ExtractVariables извлекает содержимое из запроса или ответа и присваивает этому содержимому значение переменной. Вы можете извлечь любую часть сообщения, включая заголовки, пути URI, полезную нагрузку JSON/XML, параметры формы и параметры запроса. Политика работает путем применения текстового шаблона к содержимому сообщения и, найдя совпадение, присваивает переменной указанное содержимое сообщения.
Хотя вы часто используете эту политику для извлечения информации из сообщения запроса или ответа, вы также можете использовать ее для извлечения информации из других источников, включая сущности, созданные политикой AccessEntity , объекты XML или объекты JSON.
После извлечения указанного содержимого сообщения вы можете ссылаться на эту переменную в других политиках в процессе обработки запроса и ответа.
Видео
Посмотрите следующие видеоролики, чтобы узнать больше о политике ExtractVariables.
| Видео | Описание |
|---|---|
| Извлечение переменных из XML-данных | Извлекайте переменные из XML-данных с помощью политики «Извлечение переменных». |
| Извлечение переменных из JSON-данных | Извлекайте переменные из JSON-данных с помощью политики «Извлечение переменных». |
| Извлечение переменных из параметров | Извлекайте переменные из параметров, таких как параметры запроса, заголовка, формы или URI. |
| Извлечение переменных из многозначных параметров | Извлечение переменных из многозначных параметров. |
| Извлечение переменных из параметров запроса (классический Edge) | Извлечение переменных из параметра запроса с помощью классического пользовательского интерфейса Edge. |
| Извлечение переменных из XML или JSON-данных (Classic Edge) | Извлечение переменных из XML или JSON-данных с помощью классического пользовательского интерфейса Edge. |
Образцы
Эти примеры кода политик иллюстрируют, как извлекать переменные из следующих типов артефактов:
GitHub
Эти ссылки ведут к рабочим примерам API-прокси, которые можно развернуть и запустить в Edge. Они используют ExtractVariables и находятся в репозитории api-platform-samples от Apigee на GitHub. В файлах README объясняется, как используется ExtractVariables в каждом случае, а также как развернуть и запустить каждый пример.
- Пример извлечения и присвоения переменных (извлечение данных из сообщений JSON и XML)
- Образец объекта доступа
- Пример использования пагинации и кэширования
- Пример перенаправления целевого 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 использует токены Bearer OAuth v2.0. Рассмотрим приведенный выше пример кода политики, работающий с запросом, содержащим токен OAuth v2.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 применяет описанный выше код политики ExtractVariables к этому JSON-сообщению, он устанавливает две переменные: 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 применяет указанный выше код политики ExtractVariables к этому XML-сообщению, он устанавливает три переменные: 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 создают прокси-серверы, которые ведут себя по-разному в зависимости от содержимого сообщений, включая заголовки, пути URI, полезную нагрузку и параметры запроса. Часто прокси-сервер извлекает часть этого содержимого для использования в условном операторе. Для этого используйте политику ExtractVariables.
При определении политики ExtractVariables вы можете выбрать:
- Названия переменных, которые необходимо установить.
- Источник переменных
- Сколько переменных нужно извлечь и установить?
При выполнении политика применяет текстовый шаблон к содержимому и, обнаружив совпадение, устанавливает значение указанной переменной равным содержимому. Другие политики и код затем могут использовать эти переменные для обеспечения динамического поведения или для отправки бизнес-данных в Edge API Analytics.
Чтобы узнать, как использовать ExtractVariables для создания отчетов Analytics на основе содержимого, см. раздел «Анализ содержимого сообщений 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> по умолчанию равно message . Значение message зависит от контекста. В потоке запроса message преобразуется в сообщение запроса. В потоке ответа message преобразуется в сообщение ответа.
Хотя вы часто используете эту политику для извлечения информации из сообщения запроса или ответа, вы можете использовать ее для извлечения информации из любой переменной. Например, вы можете использовать ее для извлечения информации из сущности, созданной политикой AccessEntity , из данных, возвращаемых политикой Service Callout , или для извлечения информации из объекта XML или JSON.
Если <Source> не может быть разрешен или разрешается в тип, отличный от сообщения, политика не сможет ответить.
<Source clearPayload="true|false">request</Source>
| По умолчанию: | сообщение |
| Присутствие: | Необязательный |
| Тип: | Нить |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| clearPayload | Установите значение true , если хотите очистить полезную нагрузку, указанную в <Source>, после извлечения из нее данных. | ЛОЖЬ | Необязательный | Логический |
элемент <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>
| По умолчанию: | ЛОЖЬ |
| Присутствие: | Необязательный |
| Тип: | Логический |
Если ссылка XPath в <XMLPayload> не разрешена, политика выдаст следующую ошибку:
{ "fault":{ "faultstring":"Unresolved xpath path in policy policy_name.", "detail":{ "errorcode":"steps.extractvariables.InvalidXPath" } } }
элемент <URIPath>
(Необязательно, но для получения дополнительной информации см. строку «Присутствие» в таблице ниже.) Извлекает значение из proxy.pathsuffix исходного сообщения запроса . Путь, применяемый к шаблону, — это proxy.pathsuffix, который не включает базовый путь для API-прокси. Если исходное сообщение соответствует типу сообщения «ответ» , то этот элемент ничего не делает.
<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 | Указывает игнорировать регистр при сопоставлении с шаблоном. | ЛОЖЬ | Необязательный | Логический |
<QueryParam> элемент
(Необязательно, но для получения дополнительной информации см. строку «Присутствие» в таблице ниже.) Извлекает значение из указанного параметра запроса исходного сообщения. Если исходное сообщение соответствует типу сообщения « ответ» , то этот элемент ничего не делает.
<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>. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| имя | Указывает имя параметра запроса. Если несколько параметров запроса имеют одинаковое имя, используется индексированная ссылка, где первый экземпляр параметра запроса не имеет индекса, второй — по индексу 2, третий — по индексу 3 и т. д. | Н/Д | Необходимый | Нить |
<Заголовок> элемент
(Необязательно, но для получения дополнительной информации см. строку «Присутствие» в таблице ниже.) Извлекает значение из указанного 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>. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| имя | Указывает имя заголовка, из которого извлекается значение. Если несколько заголовков имеют одинаковое имя, используется индексированная ссылка, где первый экземпляр заголовка не имеет индекса, второй — по индексу 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>. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| имя | Имя параметра формы, из которого извлекается значение. | Н/Д | Необходимый | Нить |
элемент <Переменная>
(Необязательно, но для получения дополнительной информации см. строку «Присутствие» в таблице ниже.) Указывает имя переменной, из которой следует извлечь значение.
<Variable name="myVar">
<Pattern>hello {user}</Pattern>
</Variable>Чтобы извлечь два значения из переменной:
<Variable name="myVar">
<Pattern>hello {firstName} {lastName}</Pattern>
</Variable>| По умолчанию: | Н/Д |
| Присутствие: | Необязательно. Однако необходимо указать хотя бы один из следующих параметров: <URIPath> , <QueryParam> , <Header> , <FormParam> , <JSONPayload> или <XMLPayload>. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| имя | Название переменной, из которой нужно извлечь значение. | Н/Д | Необходимый | Нить |
элемент <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.) Указывает переменную, которой присваивается извлеченное значение. Вы можете включить несколько тегов <Variable> в элемент <JSONPayload> для заполнения нескольких переменных.
<Variable name="name" type="string"> <JSONPath>{example}</JSONPath> </Variable>
| По умолчанию: | Н/Д |
| Присутствие: | Обязательно для использования внутри элемента JSONPayload. |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| имя | Указывает имя переменной, которой будет присвоено извлеченное значение. | имя | Необходимый | Нить |
| тип | Указывает тип данных значения переменной. | Н/Д | Необязательный | Строка. Выберите из:
|
элемент <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 | Установите значение | ЛОЖЬ | Необязательный | Логический |
<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>
| По умолчанию: | Н/Д |
| Присутствие: | Необязательный |
| Тип: | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие | Тип |
|---|---|---|---|---|
| имя | Указывает имя переменной, которой будет присвоено извлеченное значение. | имя | Необходимый | Нить |
| тип | Указывает тип данных значения переменной. | Логический | Необязательный | Строка. Выберите из:
|
<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 | Эта ошибка возникает, если переменная сообщения , указанная в элементе 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 | Если в политике нет элемента XPath в элементе XMLPayload , развертывание прокси-сервера API завершается с ошибкой. | build |
EmptyXPathExpression | Если политика содержит пустое выражение XPath в элементе XMLPayload , развертывание прокси-сервера API завершается неудачно. | build |
NoJSONPathsToEvaluate | Если в политике нет элемента JSONPath внутри элемента JSONPayload , развертывание прокси-сервера API завершается с ошибкой. | build |
EmptyJSONPathExpression | Если политика содержит пустое выражение XPath в элементе XMLPayload , развертывание прокси-сервера API завершается неудачей. | build |
MissingName | Если политика не имеет атрибута name ни в одном из элементов политики, таких как QueryParam , Header , FormParam или Variable , где он требуется, то развертывание прокси-сервера 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 с помощью пользовательской аналитики.