Вы просматриваете документацию 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, примерно так же, как оператор переключения работает в программировании.
Например, политика возврата ошибки может выполняться только тогда, когда установлена конкретная переменная потока. Наконец, вы можете получать и устанавливать переменные потока в целевом приложении 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 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 |
целевой ответ | Сегмент ответа 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 резервирует различные префиксы для правильной организации соответствующих переменных. Эти префиксы включают в себя:
-
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, ограничены числовыми, строковыми, логическими, нулевыми или неопределенными значениями.
Использование переменных потока в политиках
Многие политики создают переменные потока в ходе своего обычного выполнения. В справочнике по политике описаны все эти переменные, специфичные для политики.
Работая с прокси и политиками, обязательно ознакомьтесь со справочником по политикам, чтобы узнать, какие переменные создаются и для чего они используются. Например, политика квот создает набор переменных, которые содержат информацию о количестве и ограничениях квот, времени истечения срока действия и т. д.
Некоторые переменные политики полезны для отладки. Например, вы можете использовать инструмент «Трассировка» , чтобы увидеть, какие переменные были установлены в конкретном экземпляре потока прокси.
Политика 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, вызовите методы получения/установки любого из этих объектов:
-
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. Все, что вам нужно сделать, это «потребовать» модуль доступа к API в вашем коде. Подробности см. в разделе Доступ к переменным потока в Node.js.
Что вам нужно помнить
Вот несколько важных вещей, которые следует помнить о переменных потока:
- Некоторые «готовые» переменные создаются и заполняются автоматически самим прокси. Они описаны в справочнике по переменным потока .
- Вы можете создавать пользовательские переменные, доступные для использования в потоке прокси. Можно создавать переменные с помощью таких политик, как политика AssignMessage и политика JavaScript , а также в коде Node.js.
- Переменные имеют область видимости. Например, некоторые переменные заполняются автоматически, когда первый прокси-сервер получает запрос от приложения. Другие переменные заполняются в сегменте потока ответов прокси. Эти переменные ответа остаются неопределенными до тех пор, пока не будет выполнен сегмент ответа.
- При выполнении политик они могут создавать и заполнять переменные, специфичные для политики. В документации по каждой политике перечислены все соответствующие переменные, специфичные для политики.
- Условные потоки обычно оценивают одну или несколько переменных. Вам необходимо понимать переменные, если вы хотите создавать условные потоки.
- Многие политики используют переменные в качестве входных или выходных данных. Возможно, переменная, созданная одной политикой, позже будет использоваться другой.
- Вы можете получить и установить множество переменных потока из Node.js, используя обычный JavaScript (и нашу объектную модель JavaScript ) или политику JavaCallout , которая выполняет код в Edge.
Связанные примеры кода
Образцы прокси-серверов API находятся на GitHub, их легко загрузить и использовать. Информацию о загрузке и использовании примеров см. в разделе «Использование примеров прокси-серверов API» . См. список образцов для описания образцов прокси API и того, что они делают.
Примеры прокси, в которых используются переменные и обработка переменных, включают:
- переменные . Демонстрирует, как извлекать и устанавливать переменные на основе содержимого транспорта и сообщений JSON и XML.
- policy-mashup-cookbook — законченное приложение, которое использует композицию политик для вызова двух общедоступных API, объединяет результаты и генерирует расширенный ответ для клиентского приложения. Дополнительные сведения об этом примере см. в разделе Использование композиции политики .
- условная-политика — реализует простое применение условной политики на основе значений переменных.
Связанные темы
- Все переменные, которые автоматически заполняются в прокси-сервере API, перечислены в справочнике по переменным потока . В справочнике также указаны тип и область действия каждой переменной.
- Если вы хотите узнать, какие переменные заполняет конкретная политика, обратитесь к справочному разделу по этой политике. Например, см. раздел Переменные потока в справочнике по политике квот .