Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
В этой теме рассматривается объектная модель JavaScript в Apigee Edge. Важно понимать эту модель, если вы планируете использовать политику JavaScript для добавления пользовательского JavaScript в API-прокси.
О модели объектов JavaScript Edge
Объектная модель JavaScript в Apigee Edge определяет объекты со связанными свойствами, которые доступны для выполнения кода JavaScript в рамках потока прокси-сервера Apigee Edge. Для прикрепления этого пользовательского кода к потоку прокси-сервера API используется политика JavaScript.
Объекты, определенные этой моделью, имеют область видимости в рамках потока API-прокси, что означает, что определенные объекты и свойства доступны только в определенных точках потока. При выполнении вашего JavaScript-кода создается область видимости для выполнения. В этой области видимости создаются ссылки на следующие объекты:
- контекст : Объект, предоставляющий доступ к контексту сообщения.
- request : Сокращенная запись, позволяющая получить доступ к объекту request.
- response : Сокращенная запись, позволяющая получить доступ к объекту запроса.
- Криптография : предоставляет различные хэш-функции.
- print : Функция для вывода результата.
- свойства : Предоставляет доступ для чтения к свойствам конфигурации политики.
Объект контекста
Объект context имеет глобальную область видимости. Он доступен везде в потоке API-прокси. Он имеет четыре дочерних объекта: proxyRequest , proxyResponse , targetRequest , targetResponse . Эти дочерние объекты ограничены областью видимости запроса и ответа, либо запроса и ответа прокси, либо запроса и ответа целевого объекта. Например, если политика JavaScript выполняется в части потока, относящейся к конечной точке прокси, то объекты context.proxyRequest и context.proxyResponse находятся в области видимости. Если JavaScript выполняется в целевом потоке, то объекты context.targetRequest и context.targetResponse находятся в области видимости.
Объект context также имеет свойства и методы, которые подробно описаны в этом разделе. Например, следующий пример кода JavaScript использует свойство context.flow и вызывает методы get/setVariable() объекта context .
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
Эти методы взаимодействуют напрямую с переменными потока . Значение свойства context.flow — это текущая область действия потока. В потоке запроса прокси оно устанавливается в константу PROXY_REQ_FLOW . В потоке ответа целевого объекта оно устанавливается в TARGET_RESP_FLOW . Эта константа удобна для выполнения кода, специфичного для области действия. Метод getter позволяет получать переменные потока, а метод setter — устанавливать переменные потока. Эти переменные, как правило, доступны в потоке прокси и могут использоваться другими политиками.
Более подробную информацию и примеры см. в справочнике по контекстным объектам ниже.
Криптографический объект
Объект crypto добавляет базовую высокопроизводительную криптографическую поддержку в объектную модель JavaScript. Более подробную информацию и примеры см. в справочнике по объекту crypto ниже.
Объекты запроса и ответа
Объекты request и response представляют собой сокращенные ссылки на окружающие запросы и ответы, будь то запросы и ответы прокси-сервера или запросы и ответы целевого объекта. Объекты, на которые ссылаются эти переменные, зависят от контекста, в котором выполняется политика JavaScript. Если JavaScript выполняется в потоке прокси-сервера, то переменные запроса и ответа ссылаются на context.proxyRequest и context.proxyResponse . Если JavaScript выполняется в целевом потоке, то переменные ссылаются на context.targetRequest и context.targetResponse .
Функция print()
Объектная модель JavaScript включает функцию print() , которую можно использовать для вывода отладочной информации в инструмент трассировки стека (Edge Trace). См. раздел «Отладка с помощью операторов print() в JavaScript» .
Объект свойств
При использованииproperties .
Например, если ваша конфигурация JavaScript содержит:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
Затем в файле my-code.js вы можете сделать следующее:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
На практике же конфигурация позволяет коду вести себя по-разному при запуске в различных средах, в разное время или по любой другой причине.
Например, ниже указывается «имя переменной» и стиль вывода, в который JavaScript должен передавать информацию:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>
emit-results.js код мог бы сделать следующее: var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
ссылка на криптографический объект
Объект crypto позволяет выполнять базовые криптографические функции хеширования в JavaScript.
Объект crypto имеет глобальную область видимости. Он доступен повсюду в рамках потока API-прокси. Crypto позволяет работать со следующими хэш-объектами:
- ША-1
- SHA256
- SHA512
- MD5
Работа с объектами SHA-1
Вы можете создавать объекты SHA-1, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект SHA-1.
var _sha1 = crypto.getSHA1();
Обновить объект SHA-1
Синтаксис
_sha1.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект SHA-1:
_sha1.update("salt_value"); _sha1.update("some text");
Возвращает объект SHA-1 в виде шестнадцатеричной строки.
var _hashed_token = _sha1.digest();
Возвращает объект SHA-1 в виде строки base64.
var _hashed_token = _sha1.digest64();
Работа с объектами SHA-256
Вы можете создавать объекты SHA-256, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект SHA-256.
var _sha256 = crypto.getSHA256();
Обновление объекта SHA-256
Синтаксис
_sha256.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект SHA-256:
_sha256.update("salt_value"); _sha256.update("some text");
Возвращает объект SHA-256 в виде шестнадцатеричной строки.
var _hashed_token = _sha256.digest();
Возвращает объект SHA-256 в виде строки base64.
var _hashed_token = _sha256.digest64();
Работа с объектами SHA-512
Вы можете создавать объекты SHA-512, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект SHA-512.
var _sha512 = crypto.getSHA512();
Обновление объекта SHA-512
Синтаксис
_sha512.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект SHA-512:
_sha512.update("salt_value"); _sha512.update("some text");
Возвращает объект SHA-512 в виде шестнадцатеричной строки.
var _hashed_token = _sha512.digest();
Возвращает объект SHA-512 в виде строки base64.
var _hashed_token = _sha512.digest64();
Работа с объектами MD5
Вы можете создавать объекты MD5, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект MD5.
var _md5 = crypto.getMD5();
Обновить объект MD5
Синтаксис
_md5.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект MD5:
_md5.update("salt_value"); _md5.update("some text");
Возвращает объект MD5 в виде шестнадцатеричной строки.
var _hashed_token = _md5.digest();
Возвращает объект MD5 в виде строки base64.
var _hashed_token = _md5.digest64();
Поддержка криптографической даты/времени
Криптографический объект поддерживает шаблоны форматирования даты/времени.
crypto.dateFormat()
Возвращает дату в строковом формате.
Синтаксис
crypto.dateFormat(format, [timezone], [time])
Параметры
- format - (String) Базовая реализация этого параметра — java.text.SimpleDateFormat . Например: 'yyyy-MM-DD HH:mm:ss.SSS'
- часовой пояс - (Строка, необязательно) Базовая реализация этого параметра — java.util.TimeZone . Этот параметр аналогичен. По умолчанию: UTC
- time - (Число, необязательно) Значение метки времени Unix для форматирования. По умолчанию: текущее время.
Примеры
Получите текущее время с точностью до миллисекунд:
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
Узнайте текущее время для тихоокеанского часового пояса:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
Оцените значение десяти секунд, прошедших с настоящего момента:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
Дополнительные примеры. См. также документацию по java.text.SimpleDateFormat .
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Используйте функцию getHash() для получения любого из поддерживаемых хеш-объектов.
Примеры
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
Пример с использованием криптовалюты
try { // get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host // generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); // convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
ссылка на контекстный объект
- краткое описание контекстного объекта
- методы объекта контекста
- свойства контекстного объекта
- дочерние объекты контекста
Для каждой транзакции запроса/ответа, выполняемой API-прокси, создается объект context . Объект context предоставляет методы для получения, установки и удаления переменных, связанных с каждой транзакцией.
Переменные определяют свойства, специфичные для транзакции. Время суток, локаль запрашивающего клиента, пользовательский агент запрашивающего клиента и URL-адрес целевого сервиса — все это примеры переменных, доступных в context . Поэтому context полезен для построения логики, которая использует эти свойства для выполнения пользовательского поведения.
См. справочник по переменным потока и политику извлечения переменных .
краткое описание контекстного объекта
В этой таблице кратко описан контекстный объект и его дочерние элементы, а также перечислены свойства, связанные с каждым из них.
| Имя | Описание | Характеристики |
|---|---|---|
context | Оболочка для контекста конвейера обработки сообщений, а также потоков запросов и ответов, выполняемых ProxyEndpoint и TargetEndpoint. | поток, сессия |
context. proxyRequest | Объект, представляющий входящее сообщение запроса к ProxyEndpoint (от запрашивающего приложения к API-прокси). | заголовки, параметры запроса, метод, тело запроса, URL |
context. targetRequest | Объект, представляющий исходящее сообщение запроса от TargetEndpoint (от API-прокси к бэкэнд-сервису). | заголовки, параметры запроса, метод, тело запроса, URL |
context. targetResponse | Объект, представляющий входящее ответное сообщение от бэкэнд-сервиса к API-прокси. | заголовки, содержимое, статус |
context. proxyResponse | Объект, представляющий собой ответное сообщение от API-прокси к запрашивающему приложению. | заголовки, содержимое, статус |
context.flow | Название текущего потока. | См. context.flow ниже. |
context.session | Карта пар "имя/значение", которую можно использовать для передачи объектов между двумя разными шагами, выполняемыми в одном и том же контексте. Например: context.session['key'] = 123 . | Для получения дополнительной информации о том, когда следует и когда не следует использовать этот объект, см. обсуждение в сообществе Apigee . |
методы объекта контекста
context.getVariable()
Извлекает значение предопределенной или пользовательской переменной.
Синтаксис
context.getVariable("variable-name");
Пример
Чтобы получить значение за текущий год:
var year = context.getVariable('system.time.year');
context.setVariable()
Задает значение для пользовательской переменной или для любой из предопределенных переменных, доступных для записи .
Синтаксис
context.setVariable("variable-name", value);
Пример
Распространенный сценарий установки переменной — это когда API-прокси должен динамически записывать целевой URL. Следующий JavaScript-код получает значение переменной с именем USER.name , добавляет это значение в качестве параметра запроса к URL-адресу http://mocktarget.apigee.net?user= , а затем устанавливает предопределенный target.url равным этому значению.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
Удаляет переменную из контекста.
Синтаксис
context.removeVariable('variable-name');
свойства контекстного объекта
Свойство flow представляет собой строку, идентифицирующую текущий поток API-прокси. Это свойство используется для указания потока, к которому привязан JavaScript. Поддерживаемые значения:
-
PROXY_REQ_FLOW -
PROXY_RESP_FLOW -
TARGET_REQ_FLOW -
TARGET_RESP_FLOW
Каждое имя потока включает в себя предварительный поток (PreFlow), постпоток (PostFlow) и любые условные потоки (Conditional Flows), определенные в ProxyEndpoints или TargetEndpoints.
Это необязательное свойство полезно, когда стандартный JavaScript выполняется в нескольких потоках (Flow), но его поведение может меняться в зависимости от потока, в котором он выполняется. Используйте свойство Flow для модулей JavaScript, предназначенных для повторного использования в нескольких API-прокси, в которых код должен проверять текущий поток перед выполнением логики.
Пример
Установите HTTP-заголовок только в потоке targetRequest:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
Устанавливайте содержимое только в потоке proxyResponse:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
Карта пар "имя/значение", которую можно использовать для передачи объектов между двумя политиками, выполняющимися в одном и том же контексте сообщения.
Пример
Установите значение в сессии:
context.session['key'] = 123;
Получите ценную информацию из сессии:
var value = context.session['key']; // 123
дочерние объекты контекста
Как показано ниже, полный поток API-прокси включает в себя четыре отдельных этапа, каждый из которых имеет связанный объект сообщения, являющийся дочерним элементом контекстного объекта:
-
context.proxyRequest: Входящее сообщение запроса, полученное от запрашивающего клиента. -
context.targetRequest: исходящее сообщение запроса, отправляемое в бэкэнд-сервис. -
context.proxyResponse: Сообщение исходящего ответа, возвращенное запрашивающему клиенту. -
context.targetResponse: Входящее сообщение запроса, полученное от бэкэнд-сервиса.

В следующих разделах описаны методы и свойства этих объектов:
контекст.*Запрос дочерних объектов
Для каждой HTTP-транзакции, выполняемой в API-прокси, создаются два объекта запроса: один входящий (запрос от клиента) и один исходящий (запрос, сгенерированный API-прокси и отправленный на целевой бэкэнд).
Объект context имеет дочерние объекты, представляющие эти сообщения запроса: context.proxyRequest и context.targetRequest . Эти объекты позволяют получить доступ к свойствам в потоке запроса, который находится в области видимости, когда выполняется ваш код JavaScript.
Примечание: Для доступа к этим свойствам в потоке запросов можно также использовать сокращенный объект request . Объект request ссылается либо на context.proxyRequest , либо на context.targetRequest , в зависимости от того, на каком этапе потока выполняется ваш JavaScript-код.
контекст.*Запрос свойств дочернего объекта
| Название объекта недвижимости | Описание |
|---|---|
url | Свойство Полный URL-адрес запроса состоит из следующих свойств:
При получении |
Примеры: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; | |
headers | Заголовки HTTP-запроса в виде сопоставления |
Примеры: Для данного HTTP-запроса: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; вернет следующие значения application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z | |
queryParams | Параметры запроса сообщения представляют собой сопоставление |
Примеры: "?city=PaloAlto&city=NewYork"Доступ к нему можно получить следующим образом: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 | |
method | HTTP-глагол ( |
Примеры: Для данного запроса: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z Следующий JavaScript-код: context.proxyRequest.method; вернет следующее значение POST | |
body | Тело сообщения (полезная нагрузка) HTTP-запроса. В состав органа, ответственного за обработку запросов, входят следующие члены:
|
Примеры: Для XML-тела: <customer number='1'> <name>Fred<name/> <customer/> Для доступа к элементам XML-объекта используйте следующий способ: var name = context.targetRequest.body.asXML.name; Для доступа к атрибутам XML используйте обозначение var number = context.targetRequest.body.asXML.@number; Для тела JSON-запроса: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 Для чтения параметров формы: "vehicle=Car&vehicle=Truck"v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
контекст.*Дочерние объекты ответа
Для каждой HTTP-транзакции, выполняемой в API-прокси, создаются два объекта ответного сообщения: один входящий (ответ от бэкэнд-сервиса) и один исходящий (ответ, отправляемый обратно клиенту).
Объект context имеет дочерние объекты, представляющие эти ответные сообщения: context.proxyResponse и context.targetResponse . Эти объекты позволяют получить доступ к свойствам в потоке ответа, который находится в области видимости во время выполнения вашего кода JavaScript.
Примечание: Для доступа к этим свойствам из потока ответа можно также использовать сокращенный объект response . Объект response ссылается либо на context.proxyResponse , либо на context.targetResponse , в зависимости от того, где в потоке выполняется ваш код JavaScript.
Свойства объекта context.*Response
| Название объекта недвижимости | Описание |
|---|---|
headers | HTTP-заголовки ответного сообщения представляют собой сопоставление |
Пример: var cookie = context.targetResponse.headers['Set-Cookie']; | |
status | Код состояния с сообщением о состоянии в качестве свойства. И код состояния, и сообщение о состоянии доступны в качестве свойств. |
Пример: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" | |
content | Тело HTTP-запроса (содержимое полезной нагрузки) ответного сообщения. Содержимое ответа включает следующие элементы: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
Использование нотации .asXML
Существует удобный способ обхода XML-документа с помощью нотации .asXML . В этом разделе описывается, как использовать эту нотацию и чем она отличается от request.content и context.proxyRequest.content .
Например:
request.content.asXML
или
context.proxyRequest.content.asXML
Как *.content так и *.content.asXML можно использовать в строковом контексте, и JavaScript преобразует их в строки. В первом случае ( *.content ) строка включает все объявления, а также XML-комментарии. Во втором случае ( *.content.asXML ) строковое значение результата очищается от объявлений и комментариев.
Пример
msg.content:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
Кроме того, вы можете использовать формат .asXML для обхода иерархии XML, указывая имена элементов и атрибутов. Обход иерархии с использованием другого синтаксиса невозможен.
Отладка с помощью операторов print() в JavaScript.
Если вы используете политику JavaScript для выполнения пользовательского кода JavaScript, обратите внимание, что вы можете использовать функцию print() для вывода отладочной информации в инструмент трассировки . Эта функция доступна непосредственно через объектную модель JavaScript. Например:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
Чтобы просмотреть вывод, выберите пункт «Вывод из всех транзакций» в нижней части окна трассировки. Вывод также можно найти в свойстве трассировки под названием stepExecution-stdout .
Выполнение вызовов JavaScript с помощью httpClient
Используйте httpClient для выполнения нескольких параллельных асинхронных HTTP-запросов к любому URL-адресу из пользовательского кода JavaScript, выполняющегося в потоке API-прокси. Объект httpClient предоставляется объектной моделью JavaScript Apigee Edge .
О httpClient
Объект httpClient доступен для пользовательского JavaScript-кода, работающего на Apigee Edge, через объектную модель JavaScript. Для подключения пользовательского JavaScript к API-прокси используется политика JavaScript . При выполнении политики выполняется пользовательский JavaScript-код.
Объект httpClient полезен для разработки составных сервисов или мэшапов. Например, вы можете объединить несколько вызовов бэкэнда в один метод API. Этот объект часто используется в качестве альтернативы политике ServiceCallout.
Вот базовый пример использования. Создайте объект Request, присвойте ему URL-адрес (например, адрес бэкэнд-сервиса, к которому вы хотите обратиться) и вызовите метод httpClient.send с этим объектом запроса.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
Справочник httpClient
HTTP-клиент предоставляет два метода: get() и send() .
httpClient.get()
Удобный метод для простых HTTP GET запросов, не поддерживающий HTTP-заголовки.
Использование
var exchangeObj = httpClient.get(url);
Возвраты
Метод возвращает объект exchange . Этот объект не имеет свойств и предоставляет следующие методы:
-
isError(): (логическое значение) Возвращаетtrueесли httpClient не смог подключиться к серверу. Коды состояния HTTP4xxи5xxприводят к значениюisError()false, поскольку соединение было установлено и был возвращен действительный код ответа. ЕслиisError()возвращаетtrue, то вызовgetResponse()возвращает значение JavaScriptundefined. -
isSuccess(): (логическое значение) Возвращаетtrueесли отправка была завершена и прошла успешно. -
isComplete(): (логическое значение) Возвращаетtrueесли запрос завершен. -
waitForComplete(): Приостанавливает поток до завершения запроса (в случае успеха или ошибки). -
getResponse(): (object) Возвращает объект ответа, если вызовhttpClient.send()был завершен и прошел успешно. Возвращаемый объект имеет идентичные методы и свойства, что и объект context.proxyResponse. См. сводку по объекту context . -
getError(): (string) Если вызовhttpClient.send()привел к ошибке, возвращает сообщение об ошибке в виде строки.
Пример
Отправьте полностью сконфигурированный объект Request, содержащий свойства HTTP-запроса. Используйте неблокирующий коллбэк для обработки ответа.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get(myRequest, onComplete);
Использование политики JavaScript
Используйте политику JavaScript для добавления пользовательского кода JavaScript к потоку прокси. См. раздел «Политика JavaScript» .
Связанные темы
- политика JavaScript
- Объектная модель JavaScript
- Примеры и инструкции по использованию базовых функций см. в разделе «Программирование API-прокси с помощью JavaScript» .
- Рабочие примеры кода на JavaScript можно найти в репозитории Apigee Edge на GitHub.
Статьи сообщества Apigee
Вы можете найти эти статьи по теме в сообществе Apigee :
- Как обрабатывать заголовки, содержащие несколько значений, в JavaScript ?
- Книга антипаттернов «Край Апигии»
Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
В этой теме рассматривается объектная модель JavaScript в Apigee Edge. Важно понимать эту модель, если вы планируете использовать политику JavaScript для добавления пользовательского JavaScript в API-прокси.
О модели объектов JavaScript Edge
Объектная модель JavaScript в Apigee Edge определяет объекты со связанными свойствами, которые доступны для выполнения кода JavaScript в рамках потока прокси-сервера Apigee Edge. Для прикрепления этого пользовательского кода к потоку прокси-сервера API используется политика JavaScript.
Объекты, определенные этой моделью, имеют область видимости в рамках потока API-прокси, что означает, что определенные объекты и свойства доступны только в определенных точках потока. При выполнении вашего JavaScript-кода создается область видимости для выполнения. В этой области видимости создаются ссылки на следующие объекты:
- контекст : Объект, предоставляющий доступ к контексту сообщения.
- request : Сокращенная запись, позволяющая получить доступ к объекту request.
- response : Сокращенная запись, позволяющая получить доступ к объекту запроса.
- Криптография : предоставляет различные хэш-функции.
- print : Функция для вывода результата.
- свойства : Предоставляет доступ для чтения к свойствам конфигурации политики.
Объект контекста
Объект context имеет глобальную область видимости. Он доступен везде в потоке API-прокси. Он имеет четыре дочерних объекта: proxyRequest , proxyResponse , targetRequest , targetResponse . Эти дочерние объекты ограничены областью видимости запроса и ответа, либо запроса и ответа прокси, либо запроса и ответа целевого объекта. Например, если политика JavaScript выполняется в части потока, относящейся к конечной точке прокси, то объекты context.proxyRequest и context.proxyResponse находятся в области видимости. Если JavaScript выполняется в целевом потоке, то объекты context.targetRequest и context.targetResponse находятся в области видимости.
Объект context также имеет свойства и методы, которые подробно описаны в этом разделе. Например, следующий пример кода JavaScript использует свойство context.flow и вызывает методы get/setVariable() объекта context .
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
Эти методы взаимодействуют напрямую с переменными потока . Значение свойства context.flow — это текущая область действия потока. В потоке запроса прокси оно устанавливается в константу PROXY_REQ_FLOW . В потоке ответа целевого объекта оно устанавливается в TARGET_RESP_FLOW . Эта константа удобна для выполнения кода, специфичного для области действия. Метод getter позволяет получать переменные потока, а метод setter — устанавливать переменные потока. Эти переменные, как правило, доступны в потоке прокси и могут использоваться другими политиками.
Более подробную информацию и примеры см. в справочнике по контекстным объектам ниже.
Криптографический объект
Объект crypto добавляет базовую высокопроизводительную криптографическую поддержку в объектную модель JavaScript. Более подробную информацию и примеры см. в справочнике по объекту crypto ниже.
Объекты запроса и ответа
Объекты request и response представляют собой сокращенные ссылки на окружающие запросы и ответы, будь то запросы и ответы прокси-сервера или запросы и ответы целевого объекта. Объекты, на которые ссылаются эти переменные, зависят от контекста, в котором выполняется политика JavaScript. Если JavaScript выполняется в потоке прокси-сервера, то переменные запроса и ответа ссылаются на context.proxyRequest и context.proxyResponse . Если JavaScript выполняется в целевом потоке, то переменные ссылаются на context.targetRequest и context.targetResponse .
Функция print()
Объектная модель JavaScript включает функцию print() , которую можно использовать для вывода отладочной информации в инструмент трассировки стека (Edge Trace). См. раздел «Отладка с помощью операторов print() в JavaScript» .
Объект свойств
При использованииproperties .
Например, если ваша конфигурация JavaScript содержит:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
Затем в файле my-code.js вы можете сделать следующее:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
На практике же конфигурация позволяет коду вести себя по-разному при запуске в различных средах, в разное время или по любой другой причине.
Например, ниже указывается «имя переменной» и стиль вывода, в который JavaScript должен передавать информацию:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>
emit-results.js код мог бы сделать следующее: var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
ссылка на криптографический объект
Объект crypto позволяет выполнять базовые криптографические функции хеширования в JavaScript.
Объект crypto имеет глобальную область видимости. Он доступен повсюду в рамках потока API-прокси. Crypto позволяет работать со следующими хэш-объектами:
- ША-1
- SHA256
- SHA512
- MD5
Работа с объектами SHA-1
Вы можете создавать объекты SHA-1, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект SHA-1.
var _sha1 = crypto.getSHA1();
Обновить объект SHA-1
Синтаксис
_sha1.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект SHA-1:
_sha1.update("salt_value"); _sha1.update("some text");
Возвращает объект SHA-1 в виде шестнадцатеричной строки.
var _hashed_token = _sha1.digest();
Возвращает объект SHA-1 в виде строки base64.
var _hashed_token = _sha1.digest64();
Работа с объектами SHA-256
Вы можете создавать объекты SHA-256, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект SHA-256.
var _sha256 = crypto.getSHA256();
Обновление объекта SHA-256
Синтаксис
_sha256.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект SHA-256:
_sha256.update("salt_value"); _sha256.update("some text");
Возвращает объект SHA-256 в виде шестнадцатеричной строки.
var _hashed_token = _sha256.digest();
Возвращает объект SHA-256 в виде строки base64.
var _hashed_token = _sha256.digest64();
Работа с объектами SHA-512
Вы можете создавать объекты SHA-512, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект SHA-512.
var _sha512 = crypto.getSHA512();
Обновление объекта SHA-512
Синтаксис
_sha512.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект SHA-512:
_sha512.update("salt_value"); _sha512.update("some text");
Возвращает объект SHA-512 в виде шестнадцатеричной строки.
var _hashed_token = _sha512.digest();
Возвращает объект SHA-512 в виде строки base64.
var _hashed_token = _sha512.digest64();
Работа с объектами MD5
Вы можете создавать объекты MD5, обновлять их и преобразовывать в шестнадцатеричные значения и значения в формате Base64.
Создайте новый объект MD5.
var _md5 = crypto.getMD5();
Обновить объект MD5
Синтаксис
_md5.update(value);
Параметры
- значение - (Строка) Любое строковое значение.
Пример
Обновить объект MD5:
_md5.update("salt_value"); _md5.update("some text");
Возвращает объект MD5 в виде шестнадцатеричной строки.
var _hashed_token = _md5.digest();
Возвращает объект MD5 в виде строки base64.
var _hashed_token = _md5.digest64();
Поддержка криптографической даты/времени
Криптографический объект поддерживает шаблоны форматирования даты/времени.
crypto.dateFormat()
Возвращает дату в строковом формате.
Синтаксис
crypto.dateFormat(format, [timezone], [time])
Параметры
- format - (String) Базовая реализация этого параметра — java.text.SimpleDateFormat . Например: 'yyyy-MM-DD HH:mm:ss.SSS'
- часовой пояс - (Строка, необязательно) Базовая реализация этого параметра — java.util.TimeZone . Этот параметр аналогичен. По умолчанию: UTC
- time - (Число, необязательно) Значение метки времени Unix для форматирования. По умолчанию: текущее время.
Примеры
Получите текущее время с точностью до миллисекунд:
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
Узнайте текущее время для тихоокеанского часового пояса:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
Оцените значение десяти секунд, прошедших с настоящего момента:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
Дополнительные примеры. См. также документацию по java.text.SimpleDateFormat .
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Используйте функцию getHash() для получения любого из поддерживаемых хеш-объектов.
Примеры
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
Пример с использованием криптовалюты
try { // get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host // generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); // convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
ссылка на контекстный объект
- краткое описание контекстного объекта
- методы объекта контекста
- свойства контекстного объекта
- дочерние объекты контекста
Для каждой транзакции запроса/ответа, выполняемой API-прокси, создается объект context . Объект context предоставляет методы для получения, установки и удаления переменных, связанных с каждой транзакцией.
Переменные определяют свойства, специфичные для транзакции. Время суток, локаль запрашивающего клиента, пользовательский агент запрашивающего клиента и URL-адрес целевого сервиса — все это примеры переменных, доступных в context . Поэтому context полезен для построения логики, которая использует эти свойства для выполнения пользовательского поведения.
См. справочник по переменным потока и политику извлечения переменных .
краткое описание контекстного объекта
В этой таблице кратко описан контекстный объект и его дочерние элементы, а также перечислены свойства, связанные с каждым из них.
| Имя | Описание | Характеристики |
|---|---|---|
context | Оболочка для контекста конвейера обработки сообщений, а также потоков запросов и ответов, выполняемых ProxyEndpoint и TargetEndpoint. | поток, сессия |
context. proxyRequest | Объект, представляющий входящее сообщение запроса к ProxyEndpoint (от запрашивающего приложения к API-прокси). | заголовки, параметры запроса, метод, тело запроса, URL |
context. targetRequest | Объект, представляющий исходящее сообщение запроса от TargetEndpoint (от API-прокси к бэкэнд-сервису). | заголовки, параметры запроса, метод, тело запроса, URL |
context. targetResponse | Объект, представляющий входящее ответное сообщение от бэкэнд-сервиса к API-прокси. | заголовки, содержимое, статус |
context. proxyResponse | Объект, представляющий собой ответное сообщение от API-прокси к запрашивающему приложению. | заголовки, содержимое, статус |
context.flow | Название текущего потока. | См. context.flow ниже. |
context.session | Карта пар "имя/значение", которую можно использовать для передачи объектов между двумя разными шагами, выполняемыми в одном и том же контексте. Например: context.session['key'] = 123 . | Для получения дополнительной информации о том, когда следует и когда не следует использовать этот объект, см. обсуждение в сообществе Apigee . |
методы объекта контекста
context.getVariable()
Извлекает значение предопределенной или пользовательской переменной.
Синтаксис
context.getVariable("variable-name");
Пример
Чтобы получить значение за текущий год:
var year = context.getVariable('system.time.year');
context.setVariable()
Задает значение для пользовательской переменной или для любой из предопределенных переменных, доступных для записи .
Синтаксис
context.setVariable("variable-name", value);
Пример
Распространенный сценарий установки переменной — это когда API-прокси должен динамически записывать целевой URL. Следующий JavaScript-код получает значение переменной с именем USER.name , добавляет это значение в качестве параметра запроса к URL-адресу http://mocktarget.apigee.net?user= , а затем устанавливает предопределенный target.url равным этому значению.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
Удаляет переменную из контекста.
Синтаксис
context.removeVariable('variable-name');
свойства контекстного объекта
Свойство flow представляет собой строку, идентифицирующую текущий поток API-прокси. Это свойство используется для указания потока, к которому привязан JavaScript. Поддерживаемые значения:
-
PROXY_REQ_FLOW -
PROXY_RESP_FLOW -
TARGET_REQ_FLOW -
TARGET_RESP_FLOW
Каждое имя потока включает в себя предварительный поток (PreFlow), постпоток (PostFlow) и любые условные потоки (Conditional Flows), определенные в ProxyEndpoints или TargetEndpoints.
Это необязательное свойство полезно, когда стандартный JavaScript выполняется в нескольких потоках (Flow), но его поведение может меняться в зависимости от потока, в котором он выполняется. Используйте свойство Flow для модулей JavaScript, предназначенных для повторного использования в нескольких API-прокси, в которых код должен проверять текущий поток перед выполнением логики.
Пример
Установите HTTP-заголовок только в потоке targetRequest:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
Устанавливайте содержимое только в потоке proxyResponse:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
Карта пар "имя/значение", которую можно использовать для передачи объектов между двумя политиками, выполняющимися в одном и том же контексте сообщения.
Пример
Установите значение в сессии:
context.session['key'] = 123;
Получите ценную информацию из сессии:
var value = context.session['key']; // 123
дочерние объекты контекста
Как показано ниже, полный поток API-прокси включает в себя четыре отдельных этапа, каждый из которых имеет связанный объект сообщения, являющийся дочерним элементом контекстного объекта:
-
context.proxyRequest: Входящее сообщение запроса, полученное от запрашивающего клиента. -
context.targetRequest: исходящее сообщение запроса, отправляемое в бэкэнд-сервис. -
context.proxyResponse: Сообщение исходящего ответа, возвращенное запрашивающему клиенту. -
context.targetResponse: Входящее сообщение запроса, полученное от бэкэнд-сервиса.

В следующих разделах описаны методы и свойства этих объектов:
context.*Request child objects
For each HTTP transaction the executes in an API proxy, two request message objects are created: one inbound (the request from the client) and one outbound (the request generated by the API proxy and submitted to the backend target.)
The context object has child objects that represent these request messages: context.proxyRequest and context.targetRequest . These objects let you access properties within the request flow that is in scope when your JavaScript code executes.
Note: You can also use the shorthand object request to access these properties in a request flow. The request object refers to either context.proxyRequest or context.targetRequest , depending on where in the flow your JavaScript code executes.
context.*Request child object properties
| Название объекта недвижимости | Описание |
|---|---|
url | The The complete URL of the request is composed of the following properties:
When getting |
Примеры: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; | |
headers | HTTP request headers as a mapping of |
Примеры: For this HTTP request: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; will return the following values application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z | |
queryParams | The request message query parameters as a mapping of |
Примеры: "?city=PaloAlto&city=NewYork"can be accessed as: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 | |
method | The HTTP verb ( |
Примеры: For this request: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z The following JavaScript: context.proxyRequest.method; will return the following value POST | |
body | The message body (payload) of the HTTP request. The request body has the following members:
|
Примеры: For an XML body: <customer number='1'> <name>Fred<name/> <customer/> To access the elements of the XML object as follows: var name = context.targetRequest.body.asXML.name; To access XML attributes attributes, use the var number = context.targetRequest.body.asXML.@number; For a JSON request body: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 To read form parameters: "vehicle=Car&vehicle=Truck"v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
context.*Response child objects
For each HTTP transaction the executes in an API proxy, two response message objects are created: one inbound (the response from the backend service) and one outbound (the response sent back to the client.)
The context object has child objects that represent these response messages: context.proxyResponse and context.targetResponse . These objects let you access properties within the response flow that is in scope when your JavaScript code executes.
Note: You can also use the shorthand object response to access these properties from a response flow. The response object refers to either context.proxyResponse or context.targetResponse , depending on where in the flow your JavaScript code executes.
context.*Response object properties
| Название объекта недвижимости | Описание |
|---|---|
headers | The HTTP headers of the response message as a mapping of |
Пример: var cookie = context.targetResponse.headers['Set-Cookie']; | |
status | The status code with status message as a property. Both status code and status message are available as properties. |
Пример: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" | |
content | The HTTP body (payload content) of the response message. Response content has the following members: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
Using .asXML notation
There is a handy way to walk through an XML document using the .asXML notation. This section describes how to use this notation, and how it differs from request.content and context.proxyRequest.content .
Например:
request.content.asXML
или
context.proxyRequest.content.asXML
Both the *.content and *.content.asXML forms can be used in a string context, and JavaScript will coerce them to become strings. In the former case ( *.content ), the string includes all declarations as well as XML comments. In the latter case ( *.content.asXML ), the string value of the result is cleaned of declarations and comments.
Пример
msg.content:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
Furthermore, you can use the .asXML form to traverse the XML hierarchy, by specifying the names of elements and attributes. It is not possible to traverse the hierarchy using the other syntax.
Debug with JavaScript print() statements
If you're using the JavaScript policy to execute custom JavaScript code, note that you can use the print() function to output debug information to the Trace tool . This function is available directly through the JavaScript object model. For example:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
To see the output, select Output from all transactions at the bottom of the Trace window. You can also find output in the Trace property called stepExecution-stdout .
Making JavaScript callouts with httpClient
Use httpClient to make multiple, parallel, asynchronous HTTP requests to any URL from within custom JavaScript code executing in an API proxy flow. The httpClient object is exposed by the Apigee Edge Javascript object model .
About httpClient
The httpClient object is exposed to custom JavaScript code running on Apigee Edge through the JavaScript object model. To attach custom JavaScript to an API proxy, you use the JavaScript policy . When the policy runs, the custom JavaScript code executes.
The httpClient object is useful for developing composite services or mashups. For example, you can consolidate multiple backend calls into a single API method. This object is commonly used as an alternative to the ServiceCallout policy.
Here's a basic usage pattern. Instantiate a Request object, assign to it a URL (for example, to a backend service you wish to call), and call httpClient.send with that request object.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
httpClient Reference
The HTTP Client exposes two methods: get() and send() .
httpClient.get()
A convenience method for simple HTTP GET requests, with no support for HTTP headers.
Использование
var exchangeObj = httpClient.get(url);
Возвраты
The method returns an exchange object. This object has no properties, and it exposes the following methods:
-
isError(): (boolean) Returnstrueif the httpClient was unable to connect to the server. HTTP status codes4xxand5xxresult inisError()false, as the connection completed and a valid response code was returned. IfisError()returnstrue, then a call togetResponse()returns the JavaScriptundefined. -
isSuccess(): (boolean) Returnstrueif the send was complete and successful. -
isComplete(): (boolean) Returnstrueif the request is complete. -
waitForComplete(): Pauses the thread until the request is complete (by success or error). -
getResponse(): (object) Returns the response object if thehttpClient.send()was complete and successful. The returned object has the identical methods and properties as the context.proxyResponse object. See context object summary . -
getError(): (string) If the call tohttpClient.send()resulted in an error, returns the error message as a string.
Пример
Send a fully configured Request object containing the properties of the HTTP request. Use a non-blocking callback to process the response.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get(myRequest, onComplete);
Using the JavaScript policy
Use the JavaScript policy to attach custom JavaScript code to a proxy flow. See JavaScript policy .
Связанные темы
- политика JavaScript
- JavaScript object model
- For basic samples and instructions, see Programming API proxies with JavaScript .
- For working JavaScript code samples, see the Apigee Edge samples on GitHub.
Apigee Community articles
You can find these related articles on the Apigee Community :