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