Вы просматриваете документацию по 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.
Справочник по ошибкам
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .
Ошибки выполнения
Эти ошибки могут возникнуть при выполнении политики.
| Код неисправности | Статус HTTP | Причина | Исправить |
|---|---|---|---|
steps.javascript.ScriptExecutionFailed | 500 | Политика JavaScript может вызывать множество различных типов ошибок ScriptExecutionFailed. Часто встречающиеся типы ошибок включают RangeError , ReferenceError , SyntaxError , TypeError и URIError . | build |
steps.javascript.ScriptExecutionFailedLineNumber | 500 | Произошла ошибка в коде JavaScript. Подробности смотрите в строке ошибки. | Н/Д |
steps.javascript.ScriptSecurityError | 500 | Ошибка безопасности произошла при выполнении JavaScript. Подробности смотрите в строке ошибки. | Н/Д |
Ошибки развертывания
Эти ошибки могут возникнуть при развертывании прокси-сервера, содержащего эту политику.
| Название ошибки | Причина | Исправить |
|---|---|---|
InvalidResourceUrlFormat | Если формат URL-адреса ресурса, указанный в элементе <ResourceURL> или <IncludeURL> политики JavaScript, недействителен, развертывание прокси-сервера API завершается неудачно. | build |
InvalidResourceUrlReference | Если элементы <ResourceURL> или <IncludeURL> ссылаются на несуществующий файл JavaScript, развертывание прокси-сервера API завершается неудачно. Исходный файл, на который есть ссылка, должен существовать либо на уровне прокси-сервера API, либо на уровне среды, либо на уровне организации. | build |
WrongResourceType | Эта ошибка возникает во время развертывания, если элементы <ResourceURL> или <IncludeURL> политики JavaScript относятся к любому типу ресурса, кроме jsc (файл JavaScript). | build |
NoResourceURLOrSource | Развертывание политики JavaScript может завершиться неудачей из-за этой ошибки, если элемент <ResourceURL> не объявлен или если URL-адрес ресурса не определен в этом элементе. Элемент <ResourceURL> является обязательным элементом. Или элемент <IncludeURL> объявлен, но URL-адрес ресурса не определен в этом элементе. Элемент <IncludeURL> является необязательным, но если он объявлен, URL-адрес ресурса должен быть указан внутри элемента <IncludeURL> . | build |
Переменные неисправности
Эти переменные устанавливаются, когда эта политика вызывает ошибку во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
fault.name=" fault_name " | fault_name — это имя ошибки, как указано в таблице ошибок времени выполнения выше. Имя неисправности — это последняя часть кода неисправности. | fault.name Matches "ScriptExecutionFailed" |
javascript. policy_name .failed | policy_name — указанное пользователем имя политики, вызвавшей ошибку. | javascript.JavaScript-1.failed = true |
Пример ответа об ошибке
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
Пример правила неисправности
<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 вы найдете следующие статьи: