Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Что
Это правило позволяет добавлять собственный код JavaScript, который выполняется в контексте потока прокси API. В пользовательском коде JavaScript можно использовать объекты, методы и свойства модели объектов JavaScript Apigee Edge. Объектная модель позволяет получать, задавать и удалять переменные в контексте потока прокси-сервера. Вы также можете использовать базовые криптографические функции, предоставляемые объектной моделью.
Обзор
Правила JavaScript можно использовать в разных ситуациях. Например, вы можете получать и задавать переменные потока, выполнять пользовательскую логику и обработку ошибок, извлекать данные из запросов или ответов, динамически изменять целевой URL внутреннего сервиса и многое другое. Это правило позволяет реализовать специальное поведение, не предусмотренное другими стандартными правилами Edge. На самом деле с помощью политики JavaScript можно реализовать многие функции, которые доступны в других политиках, например AssignMessage и ExtractVariable.
Мы не рекомендуем использовать правила JavaScript для ведения журналов. Правила ведения журналов сообщений лучше подходят для ведения журналов на сторонних платформах, таких как Splunk, Sumo и Loggly. Кроме того, вы можете повысить производительность прокси-сервера API, выполнив правила ведения журналов сообщений в PostClientFlow, который выполняется после того, как ответ был отправлен клиенту.
Правило JavaScript позволяет указать исходный файл JavaScript для выполнения или включить код JavaScript непосредственно в конфигурацию правила с помощью элемента <Source>.
В любом случае код JavaScript выполняется, когда выполняется шаг, к которому прикреплено правило.
Если выбран вариант исходного файла, исходный код всегда хранится в стандартном месте в пакете прокси: apiproxy/resources/jsc. Вы также можете хранить исходный код в файле ресурсов на уровне среды или организации. Инструкции приведены в разделе Файлы ресурсов. Вы также можете загрузить код JavaScript через редактор прокси-сервисов в интерфейсе Apigee.
Исходные файлы JavaScript всегда должны иметь расширение .js.
Чтобы узнать, какая версия JavaScript поддерживается в настоящее время, ознакомьтесь с разделом Поддерживаемое ПО и поддерживаемые версии.
Видео
Посмотрите короткое видео о том, как создать расширение специальных правил с помощью правил JavaScript.
Примеры
Переписать целевой URL
Вот распространенный вариант использования: извлечение данных из тела запроса, сохранение их в переменной потока и использование этой переменной в другом месте потока прокси. Предположим, у вас есть приложение, в котором пользователь вводит свое имя в форму HTML и отправляет ее. Вы хотите, чтобы прокси API извлекал данные из формы и динамически добавлял их в URL, используемый для вызова внутреннего сервиса. Как это сделать с помощью правила JavaScript?
Примечание. Если вы хотите попробовать этот пример, мы предполагаем, что вы создали новый прокси-сервер в редакторе прокси-серверов. При создании укажите URL бэкенд-службы: http://www.example.com. В этом примере мы будем динамически переписывать серверный URL. Если вы не знаете, как создать новый прокси-сервер, ознакомьтесь с руководством по началу работы. .
- В интерфейсе Edge откройте прокси, созданный в редакторе прокси.
- Выберите вкладку Разработка.
- В меню "Создать" выберите Новый скрипт.
- В диалоговом окне выберите JavaScript и присвойте скрипту название, например
js-example. - Вставьте в редактор кода следующий код и сохраните прокси-сервер. Обратите внимание на объект
context. Этот объект доступен для кода JavaScript в любой точке потока прокси. Он используется для получения констант, относящихся к потоку, вызова полезных методов get/set и других операций. Эта часть объекта относится к объектной модели JavaScript Edge. Обратите внимание, что переменная потокаtarget.url– это встроенная переменная с доступом на чтение и запись, которая доступна в потоке запроса к серверу объявлений. Когда мы задаем эту переменную с URL API, Edge выполняет внутренний вызов по этому URL. Мы переписали исходный целевой URL, который вы указали при создании прокси-сервера (например, http://www.example.com).
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("info.username", username); } if (context.flow=="TARGET_REQ_FLOW") { context.setVariable("request.verb", "GET"); var name = context.getVariable("info.username"); var url = "http://mocktarget.apigee.net/" context.setVariable("target.url", url + "?user=" + name); }
- В меню "Новое правило" выберите JavaScript.
- Введите название правила, например
target-rewrite. Примите значения по умолчанию и сохраните правила. - Если выбрать в навигаторе Proxy Endpoint Preflow (Предварительная обработка конечной точки прокси), вы увидите, что в этот поток добавлено правило.
- В навигаторе выберите значок Target Endpoint PreFlow.
- В навигаторе перетащите правило JavaScript на сторону запроса целевой конечной точки в редакторе потока.
- Сохранить.
- Вызовите API, подставив правильные названия организации и прокси:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example
И напоследок давайте посмотрим на определение XML для правила JavaScript, используемого в этом примере. Важно отметить, что элемент <ResourceURL> используется для указания исходного файла JavaScript, который нужно выполнить. Аналогичный шаблон используется для любого исходного файла JavaScript: jsc://filename.js. Если в коде JavaScript требуются включения, вы можете использовать один или несколько элементов <IncludeURL>, как описано далее в этом справочнике.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite"> <DisplayName>target-rewrite</DisplayName> <Properties/> <ResourceURL>jsc://js-example.js</ResourceURL> </Javascript>
Как получить значение свойства из JavaScript
Вы можете добавить элемент <Property> в конфигурацию, а затем получить значение элемента с помощью JavaScript во время выполнения.
Чтобы указать название, с помощью которого можно будет получить доступ к свойству из кода JavaScript, используйте атрибут name элемента. Значение элемента <Property> (значение между открывающим и закрывающим тегами) – это литеральное значение, которое будет получено JavaScript.
В JavaScript значение свойства policy можно получить, обратившись к нему как к свойству объекта Properties, как показано ниже.
- Настройте ресурс. В этом случае значением свойства будет название переменной
response.status.code.<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite"> <DisplayName>JavascriptURLRewrite</DisplayName> <Properties> <Property name="source">response.status.code</Property> </Properties> <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL> </Javascript>
- Получите свойство с помощью JavaScript. Здесь полученное значение – название переменной – используется функцией
getVariableдля получения значения переменной.var responseCode = properties.source; // Returns "response.status.code" var value = context.getVariable(responseCode); // Get the value of response.status.code context.setVariable("response.header.x-target-response-code", value);
Исправление ошибок
Примеры и обсуждение методов обработки ошибок, которые можно использовать в вызове JavaScript, приведены в этой записи в сообществе Apigee. Предложения, опубликованные в сообществе Apigee, носят исключительно информационный характер и не обязательно представляют собой рекомендации Apigee.
Сведения об элементах
В справочнике по элементам описаны элементы и атрибуты правил JavaScript.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavaScript-1"> <DisplayName>JavaScript 1</DisplayName> <Properties> <Property name="propName">propertyValue</Property> </Properties> <SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo> <IncludeURL>jsc://a-javascript-library-file</IncludeURL> <ResourceURL>jsc://my-javascript-source-file</ResourceURL> <Source>insert_js_code_here</Source> </Javascript>
Атрибуты <Javascript>
<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">
Ниже перечислены атрибуты, относящиеся к этим правилам.
| Атрибут | Описание | По умолчанию | Тип поля |
|---|---|---|---|
| timeLimit |
Указывает максимальное время (в миллисекундах), в течение которого скрипту разрешено выполняться. Например, если превышено ограничение в 200 мс, правило выдаст следующую ошибку:
Примечание. Для бесплатных пробных аккаунтов время выполнения ограничено 200 мс. |
Н/Д | Обязательно |
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
Элемент <IncludeURL>
Указывает файл библиотеки JavaScript, который нужно загрузить как зависимость для основного файла JavaScript, указанного с помощью элемента <ResourceURL> или <Source>. Скрипты будут оцениваться в том порядке, в котором они указаны в правиле. В коде можно использовать объекты, методы и свойства объектной модели JavaScript.
Добавьте несколько ресурсов зависимостей JavaScript с помощью дополнительных элементов <IncludeURL>.
<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
| По умолчанию: | Нет |
| Присутствие | Необязательно |
| Тип: | Строка |
Пример
Пример можно найти в разделе Примеры.
Элемент <Property>
Указывает свойство, к которому можно получить доступ из кода JavaScript во время выполнения.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| По умолчанию: | Нет |
| Присутствие | Необязательно |
| Тип: | Строка |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля |
|---|---|---|---|
| name |
Указывает название ресурса. |
Н/Д | Обязательно. |
Пример
Пример можно найти в разделе Примеры.
Элемент <ResourceURL>
Указывает основной файл JavaScript, который будет выполняться в потоке API. Вы можете сохранить этот файл на уровне прокси API (в разделе /apiproxy/resources/jsc пакета прокси API или в разделе "Скрипты" панели навигации редактора прокси API) или на уровне организации или среды, чтобы использовать его в нескольких прокси API, как описано в статье Файлы ресурсов. В коде можно использовать объекты, методы и свойства объектной модели JavaScript.
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| По умолчанию: | Нет |
| Присутствие | Необходимо указать значение <ResourceURL> или <Source>. Если указаны оба атрибута (<ResourceURL> и <Source>), атрибут <ResourceURL> игнорируется. |
| Тип: | Строка |
Пример
Пример можно найти в разделе Примеры.
Элемент <Source>
Позволяет вставлять код JavaScript непосредственно в XML-конфигурацию правила. Вставленный код JavaScript выполняется, когда правило выполняется в потоке API.
| По умолчанию: | Нет |
| Присутствие | Необходимо указать значение <ResourceURL> или <Source>. Если указаны оба атрибута (<ResourceURL> и <Source>), атрибут <ResourceURL> игнорируется. |
| Тип: | Строка |
Пример
<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' > <Properties> <Property name='inboundHeaderName'>specialheader</Property> <Property name='outboundVariableName'>json_stringified</Property> </Properties> <Source> var varname = 'request.header.' + properties.inboundHeaderName + '.values.string'; var h = context.getVariable(varname); if (h) { h = JSON.parse(h); h.augmented = (new Date()).valueOf(); var v = JSON.stringify(h, null, 2) + '\n'; // further indent var r = new RegExp('^(\S*)','mg'); v= v.replace(r,' $1'); context.setVariable(properties.outboundVariableName, v); } </Source> </Javascript>
Элемент <SSLInfo>
Указывает свойства, используемые для настройки TLS для всех экземпляров HTTP-клиента, созданных правилом JavaScript.
<SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo>
| По умолчанию: | Нет |
| Присутствие | Необязательно |
| Тип: | Строка |
Процесс настройки TLS для клиента HTTP такой же, как и для TargetEndpoint/TargetServer. Подробнее о том, как настроить TLS от Edge до внутреннего сервера…
Примечания
Правила JavaScript не содержат кода. Вместо этого в правилах JavaScript указывается "ресурс" JavaScript и определяется шаг в потоке API, на котором выполняется код JavaScript. Вы можете загрузить скрипт через прокси-редактор интерфейса управления или добавить его в каталог /resources/jsc в прокси API, которые вы разрабатываете локально.
Отладка кода правил JavaScript
Используйте функцию print(), чтобы вывести отладочную информацию на панель вывода транзакций в инструменте трассировки. Подробную информацию и примеры можно найти в статье об отладке с помощью операторов JavaScript print().
Чтобы посмотреть операторы печати в Trace, выполните следующие действия:
- Откройте инструмент трассировки и запустите сеанс трассировки для прокси-сервера, содержащего правила JavaScript.
- Вызовите прокси.
- В инструменте трассировки нажмите Выходные данные всех транзакций, чтобы открыть панель выходных данных.

- Здесь будут показываться ваши распечатанные выписки.
Функцию print() можно использовать для вывода отладочной информации в инструмент трассировки. Эта функция доступна непосредственно через объектную модель JavaScript. Подробнее о том, как отлаживать код JavaScript с помощью операторов print()…
Переменные потока
По умолчанию это правило не заполняет никакие переменные, но вы можете задавать (и получать) переменные потока в коде JavaScript, вызывая методы объекта контекста. Типичный шаблон выглядит следующим образом:
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))
Объект контекста является частью модели объектов JavaScript Apigee Edge.
Справочник по ошибкам
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
steps.javascript.ScriptExecutionFailed |
500 | The JavaScript policy can throw many different types of ScriptExecutionFailed errors. Commonly seen types of errors include RangeError, ReferenceError, SyntaxError, TypeError, and URIError. | build |
steps.javascript.ScriptExecutionFailedLineNumber |
500 | An error occurred in the JavaScript code. See the fault string for details. | N/A |
steps.javascript.ScriptSecurityError |
500 | A security error occurred when the JavaScript executed. See the fault string for details. | N/A |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidResourceUrlFormat |
If the format of the resource URL specified within the <ResourceURL> or the <IncludeURL> element of the JavaScript policy is invalid, then the deployment of the API proxy fails. |
build |
InvalidResourceUrlReference |
If the <ResourceURL> or the <IncludeURL> elements
refer to a JavaScript file that does not exist, then the deployment of the API proxy fails.
The referenced source file must exist either the API proxy, environment, or organization level. |
build |
WrongResourceType |
This error occurs during deployment if the <ResourceURL> or the <IncludeURL>
elements of the JavaScript policy refer to any resource type other than jsc (JavaScript file). |
build |
NoResourceURLOrSource |
The deployment of the JavaScript policy can fail with this error if the <ResourceURL>
element is not declared or if the resource URL is not defined within this element.
<ResourceURL> element is a mandatory element. Or, The <IncludeURL> element is declared
but the resource URL is not defined within this element. The <IncludeURL> element is optional
but if declared, the resource URL must be specified within the <IncludeURL> element. |
build |
Fault variables
These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "ScriptExecutionFailed" |
javascript.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | javascript.JavaScript-1.failed = true |
Example error response
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
Example fault rule
<FaultRule name="JavaScript Policy Faults"> <Step> <Name>AM-CustomErrorResponse</Name> <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition> </Step> <Condition>(javascript.JavaScript-1.failed = true) </Condition> </FaultRule>
Схема
Каждый тип правил определяется схемой XML (.xsd). Схемы правил доступны на GitHub.
Статьи по теме
- Объектная модель JavaScript
- Инструкции, примеры правил и кода JavaScript можно найти в разделе Программирование прокси API с помощью JavaScript.
Статьи сообщества Apigee
В сообществе Apigee вы найдете следующие статьи: