Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Переменные потока – это объекты, к которым можно получить доступ из правил или утилит (например, инструмента трассировки). Они позволяют поддерживать состояние, связанное с транзакцией API, обработанной Apigee Edge.
Что такое переменные потока?
Переменные потока существуют в контексте потока прокси-сервера API и отслеживают состояние транзакции API так же, как именованные переменные отслеживают состояние в программном обеспечении. В переменных потока хранится следующая информация:
- IP-адрес, заголовки, путь URL и полезная нагрузка, отправленные из запрашивающего приложения.
- Системная информация, например дата и время получения запроса Edge.
- Данные, полученные при выполнении правил. Например, после выполнения правила, которое проверяет токен OAuth, Edge создает переменные потока, содержащие такую информацию, как название запрашивающего приложения.
- Информация об ответе целевой системы
Некоторые переменные встроены в Edge и автоматически заполняются при получении запроса к API. Они доступны на протяжении всей транзакции API. Вы также можете создавать собственные переменные, используя правила, например AssignMessage policy, или код JavaScript, Node.js и Java.
Как вы увидите, у переменных есть область действия, и то, где они доступны, частично зависит от того, когда они создаются в потоке прокси-сервера API. Как правило, после создания переменная становится доступна всем правилам и коду, которые выполняются позже в потоке транзакций API.
Как используются переменные потока?
Переменные потока используются в правилах и условных потоках:
- Правила могут получать данные из переменных потока и использовать их в своей работе.
Например, правило VerifyJWT может извлечь токен для проверки из переменной потока, а затем выполнить проверку. Другой пример: правило JavaScript может извлекать переменные потока и кодировать данные, содержащиеся в этих переменных.
- Условные потоки могут ссылаться на переменные потока, чтобы направлять поток API через Edge, как оператор switch в программировании.
Например, правило возврата ошибки может выполняться только при условии, что задана определенная переменная потока. Наконец, вы можете получать и задавать переменные потока в целевом приложении Node.js.
Давайте рассмотрим примеры использования переменных в каждом из этих контекстов.
Переменные потока в правилах
Некоторые правила принимают в качестве входных данных переменные потока.
Например, следующее правило AssignMessage берет значение переменной потока client.ip и помещает его в заголовок запроса My-Client-IP. Если добавить это правило в поток запроса, оно задаст заголовок, который будет передан целевому серверу. Если заголовок задан в потоке response, он отправляется обратно в клиентское приложение.
<AssignMessage name="set-ip-in-header"> <AssignTo createNew="false" transport="http" type="request">request</AssignTo> <Set> <Headers> <Header name="My-Client-IP">{client.ip}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Например, при выполнении правила квоты несколько переменных потока заполняются значениями, связанными с правилом. Одна из этих переменных называется ratelimit.my-quota-policy.used.count (где my-quota-policy – название интересующего вас правила квоты).
Позже вы можете выполнить условный поток, который гласит: "Если текущее количество квот ниже 50% от максимального и время между 9:00 и 17:00, применить другую квоту". Это условие может зависеть от значения текущего счетчика квоты и переменной потока system.time, которая является одной из встроенных переменных Edge.
Переменные процесса в процессах с условиями
Условные процессы оценивают переменные процесса и позволяют прокси-серверам работать динамически. Условия обычно используются для изменения поведения потоков, шагов и правил маршрутизации.
Ниже приведен условный поток, который оценивает значение переменной request.verb на шаге прокси-потока. В этом случае, если глагол запроса – POST, выполняется правило VerifyAPIKey. Это распространенный шаблон, используемый в конфигурациях прокси API.
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>request.verb equals "POST"</Condition>
<Name>VerifyApiKey</Name>
</Step>
</Request>
</PreFlow>Возможно, вы задаетесь вопросом, откуда берутся переменные, такие как request.verb, client.ip и system.time. Когда они создаются и заполняются значениями? Чтобы узнать, когда создаются переменные и когда они становятся доступны, ознакомьтесь со статьей Область действия переменных потока.
Переменные потока в коде JavaScript, вызываемом с помощью правила JavaScript
С помощью правила JavaScript можно выполнять код JavaScript в контексте потока прокси-сервера API. JavaScript, выполняемый этим правилом, использует объектную модель JavaScript Apigee, которая предоставляет вашему пользовательскому коду доступ к объектам запроса, ответа и контекста, связанным с потоком прокси-сервера API, в котором выполняется ваш код. Например, этот код задает заголовок ответа со значением, полученным из переменной потока target.name.
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));Этот способ использования JavaScript для чтения и установки переменных похож на то, что можно сделать с помощью правила AssignMessage (описанного выше). Это просто ещё один способ выполнять те же действия в Edge. Важно помнить, что код JavaScript, выполняемый в соответствии с правилами JavaScript, имеет доступ ко всем переменным потока, которые существуют и находятся в области действия в потоке прокси-сервера API.
Переменные потока в коде Node.js
Требуя модуль apigee-access, вы можете задавать переменные потока и получать к ним доступ из кода Node.js, развернутого в Edge.
Ниже приведен простой пример, в котором переменной custom.foo присваивается значение Bar. После этого новая переменная становится доступна для любых правил или другого кода, которые выполняются в потоке прокси после кода Node.js.
var http = require('http'); var apigee = require('apigee-access'); http.createServer(function (request, response) { apigee.setVariable(request, "custom.foo", "Bar"); response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8124); console.log('Server running at http://127.0.0.1:8124/');
Подробнее об использовании apigee-access для работы с переменными можно узнать в статье Как получить доступ к переменным потока в Node.js.
Область действия переменных потока
Область действия переменной scope связана с потоком или общим жизненным циклом вызова прокси-сервера API.
Визуализация потока прокси-сервера API
Чтобы понять область действия переменных потока, важно знать или представлять себе, как сообщения проходят через прокси-сервер API. Прокси-сервер API состоит из последовательности шагов обработки сообщений, организованных в поток. На каждом этапе процесса прокси-сервер оценивает доступную ему информацию и решает, что делать дальше. В процессе работы прокси может выполнять код правил или условное ветвление.
На рисунке ниже показана последовательность этих потоков. Обратите внимание, что потоки состоят из четырех основных сегментов: ProxyEndpoint request, TargetEndpoint request, TargetEndpoint response и ProxyEndpoint response.

Помните об этой структуре, когда мы будем изучать переменные процессов.
Как область действия переменной связана с потоком прокси
Как только вы поймете, как сообщения проходят через прокси-сервер, как описано выше, вы сможете понять область действия переменной. Под областью действия мы подразумеваем точку в жизненном цикле потока прокси, когда переменная впервые создается.
Например, если к сегменту запроса ProxyEndpoint прикреплено правило, оно не сможет получить доступ к переменным, которые относятся к сегменту запроса TargetEndpoint. Это связано с тем, что сегмент запроса TargetEndpoint потока ещё не выполнен, поэтому прокси API не успел заполнить переменные в этой области.
В таблице ниже перечислены все области действия переменных и указано, когда они становятся доступны в потоке прокси-сервера.
| Область действия переменной | Где заполняются эти переменные |
|---|---|
| запрос прокси-сервера | Сегмент запроса ProxyEndpoint |
| целевой запрос; | Сегмент запроса TargetEndpoint |
| целевой ответ; | Сегмент ответа TargetEndpoint |
| ответ прокси-сервера | Сегмент ответа ProxyEndpoint |
| всегда доступно; | Как только прокси-сервер получит запрос. Эти переменные доступны на протяжении всего жизненного цикла прокси-сервера. |
Например, в Edge есть встроенная переменная client.ip. Эта переменная имеет область действия "запрос прокси". Он автоматически заполняется IP-адресом клиента, который вызвал прокси. Он заполняется, когда запрос впервые достигает ProxyEndpoint, и остается доступным на протяжении всего жизненного цикла прокси-сервера.
Существует ещё одна встроенная переменная – target.url. Область действия этой переменной – "запрос на показ". Он заполняется в сегменте запроса TargetEndpoint URL-адресом запроса, отправленного целевому серверу. Если вы попытаетесь получить доступ к target.url в сегменте запроса ProxyEndpoint, то получите значение NULL. Если вы попытаетесь задать эту переменную до того, как она окажется в области действия, прокси-сервер ничего не сделает – не сгенерирует ошибку и не задаст переменную.
Ниже приведен простой пример, который поможет вам понять, как работает область действия переменных. Предположим, вы хотите скопировать все содержимое объекта запроса (заголовки, параметры, тело) и назначить его полезной нагрузке ответа, чтобы отправить обратно вызывающему приложению. Для этого можно использовать правило AssignMessage. Код правил выглядит следующим образом:
<AssignMessage name="CopyRequestToResponse"> <AssignTo type="response" createNew="false">response</AssignTo> <Copy source="request"/> </AssignMessage>
Это правило просто копирует объект request и назначает его объекту response. Но где в потоке прокси-сервера следует разместить это правило? Ответ заключается в том, что его нужно разместить в ответе TargetEndpoint, поскольку область действия переменной ответа – "ответ целевой конечной точки".
Как ссылаться на переменные процесса
Все встроенные переменные в Apigee Edge имеют имена, записанные с помощью точечной нотации. Это соглашение позволяет легко определить назначение переменной. Примеры: system.time.hour и request.content.
Apigee резервирует различные префиксы для правильной организации переменных. К ним относятся:
requestresponsesystemtarget
Чтобы указать переменную в правиле, заключите ее в фигурные скобки. Например, следующее правило AssignMessage берет значение переменной client.ip и помещает его в заголовок запроса Client-IP.
<AssignMessage name="set-ip-in-header"> <AssignTo createNew="false" transport="http" type="request">request</AssignTo> <Set> <Headers> <Header name="Client-IP">{client.ip}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
В условных потоках фигурные скобки не нужны. В следующем примере условия оценивается переменная request.header.accept:
<Step>
<Condition>request.header.accept = "application/json"</Condition>
<Name>XMLToJSON</Name>
</Step>Вы также можете ссылаться на переменные потока в коде JavaScript и Java. Статьи по теме
- Как работать с переменными в JavaScript
- Как получить доступ к переменным потока в Node.js
- Правила использования JavaScript
Тип данных переменных процесса
У каждого свойства переменной потока есть определенный тип данных, например String, Long, Integer, Boolean или Collection. Типы данных перечислены в справочнике по переменным потока. Для переменных, созданных правилом, информацию о типе данных можно найти в справочной статье о конкретном правиле.
Переменные, созданные вручную, имеют тип, заданный при их создании, и зависят от типов допустимых значений. Например, переменные, созданные в коде Node.js, могут иметь только следующие типы: Number, String, Boolean, null или undefined.
Использование переменных потока в правилах
Многие правила создают переменные потока в рамках своего обычного выполнения. Все эти переменные, относящиеся к правилам, описаны в документах Справочника по правилам.
При работе с прокси и правилами обязательно ознакомьтесь со справочником по правилам, чтобы узнать, какие переменные создаются и для чего они используются. Например, правило квоты создает набор переменных, содержащих информацию о количестве и лимитах квот, времени истечения срока действия и т. д.
Некоторые переменные правил полезны для отладки. Например, с помощью инструмента трассировки можно посмотреть, какие переменные были заданы в определенный момент времени в потоке прокси.
Правило ExtractVariables позволяет заполнять пользовательские переменные данными, извлеченными из писем. Вы можете извлекать параметры запроса, заголовки и другие данные. Например, вы можете анализировать сообщения запросов и ответов с помощью шаблонов, чтобы извлекать из них определенные данные.
В следующем примере Extract Variables анализирует сообщение ответа и сохраняет определенные данные, полученные из ответа. Правило создает две пользовательские переменные: geocoderesponse.latitude и geocoderesponse.longitude, а затем присваивает им значения.
<ExtractVariables name="ParseGeocodingResponse"> <Source>response</Source> <VariablePrefix>geocoderesponse</VariablePrefix> <JSONPayload> <Variable name="latitude"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
Помните, что многие правила автоматически создают переменные. Эти переменные доступны в контексте потока прокси и описаны в справочнике по правилам в разделе, посвященном каждому отдельному правилу.
Работа с переменными потока в коде JavaScript
Вы можете получать доступ к переменным и задавать их непосредственно в коде JavaScript, который выполняется в контексте прокси-сервера API. С помощью объектной модели JavaScript Apigee код JavaScript, выполняемый в Edge, получает прямой доступ к переменным потока прокси.
Чтобы получить доступ к переменным в коде JavaScript, вызовите методы получения и установки для любого из следующих объектов:
contextproxyRequestproxyResponsetargetRequesttargetResponse
Как видите, эти ссылки на объекты соответствуют знакомым сегментам модели потока прокси-сервера API, как описано в разделе Визуализация потока прокси-сервера API.
Объект context соответствует глобально доступным переменным, например системным. Например, чтобы получить текущий год, можно вызвать метод getVariable() для объекта context:
var year = context.getVariable('system.time.year');
Аналогичным образом можно вызвать функцию setVariable(), чтобы задать значение пользовательской переменной или любой доступной для записи стандартной переменной. Здесь мы создаем пользовательскую переменную organization.name.myorg и присваиваем ей значение.
var org = context.setVariable('organization.name.myorg', value);
Поскольку эта переменная создается с помощью объекта context, она будет доступна для всех сегментов потока (по сути, это как создание глобальной переменной).
Вы также можете получать и задавать переменные потока прокси в коде Java, который выполняется с помощью правила JavaCallout.
Как получить доступ к переменным потока в приложениях Node.js
Вы можете получать, задавать и удалять переменные потока из кода Node.js, развернутого в Edge. Вам нужно только добавить в код модуль apigee-access. Подробнее о том, как получить доступ к переменным потока в Node.js…
Что нужно помнить
Вот несколько важных моментов, которые нужно помнить о переменных потока:
- Некоторые стандартные переменные создаются и заполняются автоматически самим прокси-сервером. Они описаны в справочнике по переменным потока.
- Вы можете создавать специальные переменные, которые можно использовать в потоке прокси. Переменные можно создавать с помощью правил, например AssignMessage policy и JavaScript policy, а также в коде Node.js.
- У переменных есть область действия. Например, некоторые переменные заполняются автоматически, когда первый прокси-сервер получает запрос от приложения. Другие переменные заполняются в сегменте потока ответов прокси-сервера. Эти переменные ответа остаются неопределенными до тех пор, пока не будет выполнен сегмент ответа.
- При выполнении правил могут создаваться и заполняться переменные, относящиеся к определенным правилам. В документации к каждому правилу перечислены все относящиеся к нему переменные.
- Условные потоки обычно оценивают одну или несколько переменных. Чтобы создавать условные цепочки, необходимо понимать, что такое переменные.
- Во многих правилах используются входные и выходные переменные. Например, переменная, созданная одним правилом, может использоваться другим.
- Получать и задавать многие переменные потока в Node.js можно с помощью обычного JavaScript (и нашей объектной модели JavaScript) или правила JavaCallout, которое выполняет код в Edge.
Примеры кода
Примеры прокси-серверов API доступны на GitHub. Их легко скачать и использовать. Подробнее о том, как скачать и использовать примеры прокси API… Описание примеров прокси API и их функций приведено в списке примеров.
Примеры прокси-серверов, в которых используются переменные и их обработка:
- variables – пример того, как извлекать и задавать переменные на основе транспорта и содержимого сообщений JSON и XML.
- policy-mashup-cookbook – полноценное приложение, в котором для вызова двух общедоступных API используется композиция правил, а полученные результаты объединяются и на их основе создается расширенный ответ для клиентского приложения. Дополнительную информацию об этом примере можно найти в разделе Использование композиции правил.
- conditional-policy – реализует простое условное применение правил на основе значений переменных.
Статьи по теме
- Все переменные, которые автоматически заполняются в прокси-сервере API, перечислены в справочнике по переменным потока. В справочнике также указаны тип и область действия каждой переменной.
- Чтобы узнать, какие переменные используются в определенных правилах, ознакомьтесь со справочной информацией о них. Например, ознакомьтесь с разделом Переменные потока в справочнике по правилам квоты.