Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Концептуально, переменные потока — это объекты, к которым можно получить доступ из ваших политик или утилит (например, инструмента трассировки ). Они позволяют поддерживать состояние, связанное с транзакцией API, обрабатываемой Apigee Edge.
Что такое переменные потока?
Переменные потока существуют в контексте потока API-прокси и отслеживают состояние в транзакции API так же, как именованные переменные отслеживают состояние в программном обеспечении. Переменные потока хранят такую информацию, как:
- IP-адрес, заголовки, URL-адрес и полезная нагрузка, отправленные запрашивающим приложением.
- Системная информация, такая как дата и время получения запроса Edge.
- Данные, получаемые при выполнении политики. Например, после выполнения политики, проверяющей токен OAuth, Edge создает переменные потока, содержащие такую информацию, как имя запрашивающего приложения.
- Информация об ответе целевой системы.
Некоторые переменные "встроены" в Edge и автоматически заполняются при каждом получении запроса к API. Они доступны на протяжении всей транзакции API. Вы также можете создавать собственные пользовательские переменные, используя такие политики, как политика AssignMessage , или в коде JavaScript, Node.js и Java.
Как вы увидите, переменные имеют область видимости, и то, где они доступны, частично зависит от момента их создания в потоке API-прокси. В общем, когда переменная создана, она становится доступной для всех политик и кода, которые выполняются позже в потоке транзакций API.
Как используются переменные потока?
Переменные потока используются в политиках и условных потоках :
- Политики могут получать состояние из переменных потока и использовать их для выполнения своей работы.
Например, политика VerifyJWT может получить токен для проверки из переменной потока, а затем выполнить проверку на его основе. В качестве другого примера, политика JavaScript может получить переменные потока и закодировать данные, содержащиеся в этих переменных.
- Условные потоки могут ссылаться на переменные потока для управления потоком API через Edge, подобно тому, как работает оператор switch в программировании.
Например, политика, возвращающая ошибку, может выполняться только тогда, когда установлена определенная переменная потока. Наконец, вы можете получать и устанавливать переменные потока в целевом приложении Node.js.
Рассмотрим примеры использования переменных в каждом из этих контекстов.
Потоковые переменные в политике
Некоторые политики принимают в качестве входных данных переменные потока.
Например, следующая политика AssignMessage берет значение переменной потока client.ip и помещает его в заголовок запроса с именем My-Client-IP . Если она добавлена к потоку запроса , эта политика устанавливает заголовок, который передается на целевую серверную часть. Если она установлена в потоке ответа , заголовок отправляется обратно в клиентское приложение.
<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» .
Понимание области действия переменных потока
Область видимости переменных связана с потоком или общим «жизненным циклом» вызова API-прокси.
Визуализация потока работы API-прокси
Для понимания области видимости переменных потока важно понимать или визуализировать, как сообщения проходят через API-прокси. API-прокси представляет собой последовательность шагов обработки сообщений, организованных в виде потока. На каждом шаге потока прокси оценивает доступную ему информацию и принимает решение о дальнейших действиях. В процессе работы прокси может выполнять код политики или осуществлять условное ветвление .
На следующем рисунке показана эта последовательность потоков. Обратите внимание, что потоки состоят из четырех основных сегментов: запрос ProxyEndpoint, запрос TargetEndpoint, ответ TargetEndpoint и ответ ProxyEndpoint.

Помните об этой структуре потока, когда мы начнем изучать переменные потока в оставшейся части этой темы.
Как переменная область видимости связана с потоком прокси-сервера
Как только вы сможете визуализировать, как сообщения проходят через прокси-сервер, как описано ранее, вы сможете начать понимать область видимости переменных. Под областью видимости мы подразумеваем момент в жизненном цикле потока данных через прокси-сервер, когда переменная впервые создается.
Например, если к сегменту запроса ProxyEndpoint привязана политика, эта политика не сможет получить доступ к переменным, область действия которых ограничена сегментом запроса TargetEndpoint. Причина в том, что сегмент запроса TargetEndpoint еще не выполнен, поэтому API-прокси еще не успел заполнить переменные в этой области действия.
В следующей таблице приведен полный набор областей видимости переменных и указано, когда в процессе работы прокси-сервера они становятся доступными.
| Переменная область видимости | Где эти переменные заполнены |
|---|---|
| прокси-запрос | Сегмент запроса ProxyEndpoint |
| целевой запрос | Сегмент запроса TargetEndpoint |
| целевой ответ | Сегмент ответа TargetEnpoint |
| ответ через прокси | Сегмент ответа ProxyEntpoint |
| всегда доступен | Как только прокси-сервер получает запрос, эти переменные становятся доступны на протяжении всего жизненного цикла работы прокси-сервера. |
Например, в 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 резервирует различные префиксы для надлежащей организации соответствующих переменных. К этим префиксам относятся:
-
request -
response -
system -
target
Чтобы сослаться на переменную в политике, заключите её в фигурные скобки. Например, следующая политика 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. Для получения дополнительной информации см.:
Тип данных переменных потока
Каждое свойство переменной потока имеет четко определенный тип данных, например, String, Long, Integer, Boolean или Collection. Типы данных можно найти в справочнике по переменным потока . Для переменных, созданных политикой, обратитесь к соответствующему разделу справочника по политике для получения информации о типах данных.
Создаваемые вами вручную переменные принимают тип, указанный при их создании, и зависят от допустимых типов значений. Например, переменные, созданные в коде Node.js, могут принимать только значения Number, String, Boolean, null или undefined.
Использование переменных потока в политиках
Многие политики создают переменные потока в процессе своего обычного выполнения. В справочнике по политикам описаны все эти переменные, специфичные для каждой политики.
При работе с прокси-серверами и политиками обязательно обращайтесь к справочнику по политикам, чтобы узнать, какие переменные создаются и для чего они используются. Например, политика квот создает набор переменных, содержащих информацию о количестве и лимитах квот, времени истечения срока действия и так далее.
Некоторые переменные политики полезны для отладки. Например, вы можете использовать инструмент трассировки , чтобы увидеть, какие переменные были установлены в конкретный момент времени в потоке прокси-сервера.
Политика ExtractVariables позволяет заполнять пользовательские переменные данными, извлеченными из сообщений. Вы можете извлекать параметры запроса, заголовки и другие данные. Например, вы можете анализировать сообщения запроса и ответа, используя шаблоны для извлечения определенных данных из сообщений.
В следующем примере функция «Извлечение переменных» анализирует ответное сообщение и сохраняет определенные данные, взятые из ответа. Политика создает две пользовательские переменные, 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 вызовите методы getter/setter для любого из этих объектов:
-
context -
proxyRequest -
proxyResponse -
targetRequest -
targetResponse
Как видите, эти ссылки на объекты соответствуют знакомым сегментам модели потока прокси-сервера, как объяснялось ранее в разделе «Визуализация потока 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 и политика JavaScript , а также в коде Node.js.
- Переменные имеют область видимости. Например, некоторые переменные автоматически заполняются, когда первый прокси-сервер получает запрос от приложения. Другие переменные заполняются в сегменте потока ответа прокси-сервера. Эти переменные ответа остаются неопределенными до тех пор, пока не будет выполнен сегмент ответа.
- При выполнении политик могут создаваться и заполняться переменные, специфичные для каждой политики. В документации к каждой политике перечислены все эти соответствующие переменные.
- Условные потоки обычно оценивают одну или несколько переменных. Для создания условных потоков необходимо понимать, что такое переменные.
- Во многих политиках переменные используются в качестве входных или выходных данных. Например, переменная, созданная в рамках одной политики, впоследствии может быть использована в рамках другой.
- Вы можете получать и устанавливать множество переменных потока непосредственно в Node.js, используя чистый JavaScript (и нашу объектную модель JavaScript ) или политику JavaCallout , которая выполняет код в Edge.
Примеры кода по теме
Примеры API-прокси размещены на GitHub и легко загружаются и используются. Информацию о загрузке и использовании примеров см. в разделе «Использование примеров API-прокси» . Описание примеров API-прокси и их функций см. в разделе «Список примеров» .
Примерами аппроксимаций, использующих переменные и обработку переменных, являются:
- переменные — демонстрирует, как извлекать и устанавливать переменные на основе транспортного протокола, а также содержимого сообщений в форматах JSON и XML.
- policy-mashup-cookbook — это полноценное приложение, использующее композицию политик для вызова двух общедоступных API, объединения результатов и генерации расширенного ответа для клиентского приложения. Дополнительную информацию об этом примере см. в разделе «Использование композиции политик» .
- conditional-policy — Реализует простое условное применение политики на основе значений переменных.
Связанные темы
- Все переменные, которые автоматически заполняются в API-прокси, перечислены в справочнике переменных Flow . В справочнике также указаны тип и область действия каждой переменной.
- Если вы хотите узнать, какие переменные заполняет конкретная политика, обратитесь к справочному разделу по этой политике. Например, см. раздел «Переменные потока» в справочнике по политикам квот .