Объектная модель 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 .

Объектная модель JavaScript включает функцию print() , которую можно использовать для вывода отладочной информации в инструмент трассировки стека (Edge Trace). См. раздел «Отладка с помощью операторов print() в JavaScript» .

Объект свойств

При использовании В элементе конфигурации политики код 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 — это удобное свойство для чтения и записи, объединяющее параметры схемы, хоста, порта, пути и запроса для объекта targetRequest.

Полный URL-адрес запроса состоит из следующих свойств:

  • Протокол: протокол URL-адреса (например, HTTP, HTTPS)
  • порт: Название порта (например, :80, :443)
  • хост: хост URL-адреса (например, www.example.com)
  • path: Путь URI (например, /v1/mocktarget)

При получении url возвращается URL-адрес в следующем формате:

protocol://host:port/path?queryParams

Примеры:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

Заголовки HTTP-запроса в виде сопоставления String => List

Примеры:

Для данного HTTP-запроса:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
Следующий JavaScript-код:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

вернет следующие значения

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

Параметры запроса сообщения представляют собой сопоставление String => List .

Примеры:

"?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-глагол ( GET , POST , PUT , DELETE , PATCH и т. д.), связанный с запросом.

Примеры:

Для данного запроса:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

Следующий JavaScript-код:

context.proxyRequest.method;

вернет следующее значение

POST
body

Тело сообщения (полезная нагрузка) HTTP-запроса.

В состав органа, ответственного за обработку запросов, входят следующие члены:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Примеры:

Для 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-заголовки ответного сообщения представляют собой сопоставление String => List .

Пример:

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 не смог подключиться к серверу. Коды состояния HTTP 4xx и 5xx приводят к значению isError() false , поскольку соединение было установлено и был возвращен действительный код ответа. Если isError() возвращает true , то вызов getResponse() возвращает значение JavaScript undefined .
  • 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» .

Связанные темы

Статьи сообщества Apigee

Вы можете найти эти статьи по теме в сообществе Apigee :

,

Вы просматриваете документацию 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 .

Объектная модель JavaScript включает функцию print() , которую можно использовать для вывода отладочной информации в инструмент трассировки стека (Edge Trace). См. раздел «Отладка с помощью операторов print() в JavaScript» .

Объект свойств

При использовании В элементе конфигурации политики код 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 url property is a read/write convenience property that combines scheme, host, port, path and query parameters for the targetRequest.

The complete URL of the request is composed of the following properties:

  • protocol: The protocol of the URL (for example, HTTP, HTTPS)
  • port: The port (for example, :80, :443)
  • host: The host of the URL (for example, www.example.com)
  • path: The path of the URI (for example, /v1/mocktarget)

When getting url , a URL is returned in the following format:

protocol://host:port/path?queryParams

Примеры:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

HTTP request headers as a mapping of String => List

Примеры:

For this HTTP request:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
The following JavaScript:
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 String => List .

Примеры:

"?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 ( GET , POST , PUT , DELETE , PATCH , and so on) associated with the request

Примеры:

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:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

Примеры:

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 @ notation.

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 String => List .

Пример:

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) Returns true if the httpClient was unable to connect to the server. HTTP status codes 4xx and 5xx result in isError() false , as the connection completed and a valid response code was returned. If isError() returns true , then a call to getResponse() returns the JavaScript undefined .
  • isSuccess() : (boolean) Returns true if the send was complete and successful.
  • isComplete() : (boolean) Returns true if the request is complete.
  • waitForComplete() : Pauses the thread until the request is complete (by success or error).
  • getResponse() : (object) Returns the response object if the httpClient.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 to httpClient.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 .

Связанные темы

Apigee Community articles

You can find these related articles on the Apigee Community :