Вы просматриваете документацию 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-адресу, используемому для вызова бэкэнд-сервиса. Как это сделать с помощью политики 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. Примите значения по умолчанию и сохраните политику. - Если вы выберете «Предварительный поток конечной точки прокси» в навигаторе, вы увидите, что политика была добавлена к этому потоку.
- В навигаторе выберите значок 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 значение свойства 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>
| По умолчанию: | Никто |
| Присутствие: | Необязательный |
| Тип: | Нить |
Пример
Базовый пример смотрите в разделе «Примеры» .
элемент <Свойства>
Указывает свойство, к которому можно получить доступ из кода 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() для вывода отладочной информации на панель вывода транзакций в инструменте трассировки. Подробности и примеры см. в разделе «Отладка с помощью операторов print() в JavaScript».
Чтобы просмотреть выписки в 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 :