Правило ExtractVariables

Вы просматриваете документацию по 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 в каждом случае, а также как развернуть и запустить каждый пример.

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

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

Элемент <Source>

(Необязательно) Указывает переменную, которую нужно проанализировать. Значение свойства <Source> по умолчанию – message. Значение message зависит от контекста. В потоке запроса message преобразуется в сообщение запроса. В цепочке ответов message преобразуется в ответное сообщение.

Хотя это правило часто используется для извлечения информации из запроса или сообщения ответа, его можно применять для извлечения информации из любой переменной. Например, с его помощью можно извлечь информацию из объекта, созданного правилом AccessEntity, из данных, возвращенных правилом Service Callout, или из объекта XML или JSON.

Если <Source> не удается разрешить или он разрешается в тип, отличный от типа сообщения, правило не будет отвечать.

<Source clearPayload="true|false">request</Source>
По умолчанию: Сообщение
Присутствие Необязательно
Тип: Строка

Атрибуты

Атрибут Описание По умолчанию Тип поля Тип
clearPayload

Установите значение true, если вы хотите очистить полезную нагрузку, указанную в элементе <Source>, после извлечения из нее данных.

Используйте вариант <clearPayload>, только если исходное сообщение не требуется после выполнения ExtractVariables. Если задать значение true, память, используемая сообщением, освободится.

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

Обязательно Строка
тип Указывает тип данных значения переменной. Н/Д Необязательно

Строка. Доступные варианты:

  • string
  • Логическое значение
  • Целое число
  • long
  • число с плавающей запятой
  • Double
  • nodeset (возвращает фрагмент JSON)

Элемент <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

Установите значение true, чтобы остановить оценку XPath после заполнения одной переменной. Это означает, что правилом заполняется только одна переменная.

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

Обязательно Строка
тип Указывает тип данных значения переменной. Логическое значение Необязательно

Строка. Доступные варианты:

  • string
  • Логическое значение
  • Целое число
  • long
  • число с плавающей запятой
  • Double
  • nodeset (возвращает фрагмент XML);

Элемент <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

Эта ошибка возникает в следующих случаях:

  • Входная полезная нагрузка (JSON, XML) пуста.
  • Входные данные (JSON, XML и т. д.), переданные правилу, недействительны или имеют неправильный формат.
steps.extractvariables.ImmutableVariable 500 Переменная, используемая в правиле, неизменяема. Правило не смогло задать эту переменную.
steps.extractvariables.InvalidJSONPath 500 Эта ошибка возникает, если в элементе JSONPath правила используется недопустимый путь JSON. Например, если в полезной нагрузке JSON нет объекта Name, но вы указали Name в качестве пути в правиле, возникнет эта ошибка.
steps.extractvariables.JsonPathParsingFailure 500 Эта ошибка возникает, когда правилу не удается обработать путь JSON и извлечь данные из переменной потока, указанной в элементе Source. Обычно это происходит, если переменная потока, указанная в элементе Source, не существует в текущем потоке.
steps.extractvariables.SetVariableFailed 500 Эта ошибка возникает, если правилу не удалось задать значение для переменной. Эта ошибка обычно возникает, если вы пытаетесь присвоить значения нескольким переменным, названия которых начинаются с одних и тех же слов вложенного формата с точками.
steps.extractvariables.SourceMessageNotAvailable 500 Эта ошибка возникает, если переменная message, указанная в элементе Source правила, является:
  • Не в области действия (недоступно в определенном процессе, в котором выполняется правило) или
  • Не удается разрешить (не определено)
steps.extractvariables.UnableToCast 500 Эта ошибка возникает, если правило не может преобразовать извлеченное значение в переменную. Обычно это происходит, когда вы пытаетесь присвоить переменной одного типа данных значение другого типа.

Ошибки развертывания

Эти ошибки могут возникать при развертывании прокси-сервера, содержащего это правило.

Название ошибки Причина Исправить
NothingToExtract Если в правиле нет элементов URIPath, QueryParam, Header, FormParam, XMLPayload или JSONPayload, развертывание прокси API завершится неудачно, поскольку извлекать будет нечего.
NONEmptyPrefixMappedToEmptyURI Эта ошибка возникает, если в правиле определен префикс в элементе Namespace под элементом XMLPayload, но не определен URI.
DuplicatePrefix Эта ошибка возникает, если в элементе Namespace в элементе XMLPayload префикс правила определен более одного раза.
NoXPathsToEvaluate Если в элементе XMLPayload нет элемента XPath, развертывание прокси-сервера API завершится с ошибкой.
EmptyXPathExpression Если в правиле есть пустое выражение XPath в элементе XMLPayload, развертывание прокси-сервера API завершится неудачно.
NoJSONPathsToEvaluate Если в элементе JSONPayload нет элемента JSONPath, развертывание прокси-сервера API завершится с ошибкой.
EmptyJSONPathExpression Если в правиле есть пустое выражение XPath в элементе XMLPayload, развертывание прокси-сервера API завершится неудачно.
MissingName Если в каком-либо элементе правил, например QueryParam, Header, FormParam или Variable, отсутствует атрибут name, то развертывание прокси-сервера API завершится неудачно.
PatternWithoutVariable Если в элементе Pattern правила не указана переменная, развертывание прокси-сервера API завершится неудачно. Элементу Pattern требуется название переменной, в которой будут храниться извлеченные данные.
CannotBeConvertedToNodeset Если в правиле есть выражение XPath, в котором тип Variable определен как nodeset, но выражение нельзя преобразовать в nodeset, развертывание прокси-сервера API завершится неудачно.
JSONPathCompilationFailed Правило не может скомпилировать указанный путь JSON.
InstantiationFailed Не удалось создать экземпляр правила.
XPathCompilationFailed Если префикс или значение, используемое в элементе XPath, не входит ни в одно из объявленных в правиле пространств имен, развертывание прокси-сервера API завершится неудачно.
InvalidPattern Если определение элемента Pattern недействительно в каком-либо из элементов, например URIPath, QueryParam, Header, FormParam, XMLPayload или JSONPayload, в правиле, развертывание прокси-сервера API завершится неудачей.

Переменные ошибок

Эти переменные задаются, когда правило вызывает ошибку во время выполнения. Подробнее о нарушениях правил…

Переменные Место Пример
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 с помощью специальной аналитики

Справочник по переменным