Правила JavaScript

Вы просматриваете документацию по 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. Если вы не знаете, как создать новый прокси-сервер, ознакомьтесь с руководством по началу работы. .

  1. В интерфейсе Edge откройте прокси, созданный в редакторе прокси.
  2. Выберите вкладку Разработка.
  3. В меню "Создать" выберите Новый скрипт.
  4. В диалоговом окне выберите JavaScript и присвойте скрипту название, например js-example.
  5. Вставьте в редактор кода следующий код и сохраните прокси-сервер. Обратите внимание на объект 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);
    }
  6. В меню "Новое правило" выберите JavaScript.
  7. Введите название правила, например target-rewrite. Примите значения по умолчанию и сохраните правила.
  8. Если выбрать в навигаторе Proxy Endpoint Preflow (Предварительная обработка конечной точки прокси), вы увидите, что в этот поток добавлено правило.
  9. В навигаторе выберите значок Target Endpoint PreFlow.
  10. В навигаторе перетащите правило JavaScript на сторону запроса целевой конечной точки в редакторе потока.
  11. Сохранить.
  12. Вызовите 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 мс, правило выдаст следующую ошибку: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms.

Примечание. Для бесплатных пробных аккаунтов время выполнения ограничено 200 мс.

Н/Д Обязательно

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

Элемент <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, выполните следующие действия:

  1. Откройте инструмент трассировки и запустите сеанс трассировки для прокси-сервера, содержащего правила JavaScript.
  2. Вызовите прокси.
  3. В инструменте трассировки нажмите Выходные данные всех транзакций, чтобы открыть панель выходных данных.

  4. Здесь будут показываться ваши распечатанные выписки.

Функцию 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 .
steps.javascript.ScriptExecutionFailedLineNumber 500 Произошла ошибка в коде JavaScript. Подробности смотрите в строке ошибки. Н/Д
steps.javascript.ScriptSecurityError 500 Ошибка безопасности произошла при выполнении JavaScript. Подробности смотрите в строке ошибки. Н/Д

Ошибки развертывания

Эти ошибки могут возникнуть при развертывании прокси-сервера, содержащего эту политику.

Название ошибки Причина Исправить
InvalidResourceUrlFormat Если формат URL-адреса ресурса, указанный в элементе <ResourceURL> или <IncludeURL> политики JavaScript, недействителен, развертывание прокси-сервера API завершается неудачно.
InvalidResourceUrlReference Если элементы <ResourceURL> или <IncludeURL> ссылаются на несуществующий файл JavaScript, развертывание прокси-сервера API завершается неудачно. Исходный файл, на который есть ссылка, должен существовать либо на уровне прокси-сервера API, либо на уровне среды, либо на уровне организации.
WrongResourceType Эта ошибка возникает во время развертывания, если элементы <ResourceURL> или <IncludeURL> политики JavaScript относятся к любому типу ресурса, кроме jsc (файл JavaScript).
NoResourceURLOrSource Развертывание политики JavaScript может завершиться неудачей из-за этой ошибки, если элемент <ResourceURL> не объявлен или если URL-адрес ресурса не определен в этом элементе. Элемент <ResourceURL> является обязательным элементом. Или элемент <IncludeURL> объявлен, но URL-адрес ресурса не определен в этом элементе. Элемент <IncludeURL> является необязательным, но если он объявлен, URL-адрес ресурса должен быть указан внутри элемента <IncludeURL> .

Переменные неисправности

Эти переменные устанавливаются, когда эта политика вызывает ошибку во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .

Переменные Где Пример
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.

Статьи по теме

Статьи сообщества Apigee

В сообществе Apigee вы найдете следующие статьи: