Вы просматриваете документацию Apigee Edge .
Перейти к документации Apigee X. info
Что
Эта политика позволяет добавлять пользовательский код 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 UI.
Исходные файлы JavaScript всегда должны иметь расширение .js .
Информацию о поддерживаемой в настоящее время версии JavaScript см. в разделе Поддерживаемое программное обеспечение и поддерживаемые версии .
Видео
Посмотрите короткое видео, чтобы узнать, как создать пользовательское расширение политики с помощью политики JavaScript.
Образцы
Перепишите целевой URL
Вот типичный пример использования: извлечение данных из тела запроса, сохранение их в переменной потока и использование этой переменной потока в другом месте потока прокси. Предположим, у вас есть приложение, в котором пользователь вводит своё имя в HTML-форму и отправляет её. Вы хотите, чтобы прокси-сервер API извлекал данные формы и динамически добавлял их в URL-адрес, используемый для вызова бэкенд-службы. Как это реализовать в политике JavsScript?
Примечание: Если вы хотите опробовать этот пример, мы предполагаем, что вы создали новый прокси-сервер в редакторе прокси-серверов. При его создании просто укажите URL-адрес бэкенд-сервиса: http://www.example.com. В этом примере мы будем динамически перезаписывать URL-адрес бэкенда. Если вы не знаете, как создать новый прокси-сервер, обратитесь к руководству по началу работы.
- В Edge UI откройте прокси-сервер, созданный в редакторе прокси-серверов.
- Выберите вкладку «Разработка» .
- В меню «Новый» выберите «Новый сценарий» .
- В диалоговом окне выберите 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 в Navigator, вы увидите, что политика была добавлена в этот поток.
- В навигаторе выберите значок 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 во время выполнения.
Используйте атрибут name элемента, чтобы указать имя, по которому будет осуществляться доступ к свойству из кода JavaScript. Значение элемента <Property> (значение между открывающим и закрывающим тегами) — это литеральное значение, которое будет получено JavaScript.
В JavaScript значение свойства политики извлекается путем доступа к нему как к свойству объекта 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>
| По умолчанию: | Никто |
| Присутствие: | Необязательный |
| Тип: | Нить |
Пример
См. базовый пример в разделе «Примеры» .
Элемент <Свойства>
Указывает свойство, к которому можно получить доступ из кода JavaScript во время выполнения.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| По умолчанию: | Никто |
| Присутствие: | Необязательный |
| Тип: | Нить |
Атрибуты
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
| имя | Указывает имя свойства. | Н/Д | Необходимый. |
Пример
См. пример в разделе «Примеры» .
Элемент <ResourceURL>
Указывает основной файл JavaScript, который будет выполняться в потоке API. Этот файл можно сохранить в области действия прокси API (в папке /apiproxy/resources/jsc в пакете прокси API или в разделе «Скрипты» на панели «Навигатор» редактора прокси API), а также в области действия организации или среды для повторного использования в нескольких прокси API, как описано в разделе «Файлы ресурсов» . Ваш код может использовать объекты, методы и свойства объектной модели JavaScript .
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| По умолчанию: | Никто |
| Присутствие: | Требуется либо <ResourceURL> , либо <Source> . Если присутствуют оба параметра: <ResourceURL> и <Source> , то <ResourceURL> игнорируется. |
| Тип: | Нить |
Пример
См. базовый пример в разделе «Примеры» .
Элемент <Источник>
Позволяет вставлять 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-клиента аналогичен процессу настройки TLS для 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 :