Политика JavaScript

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

  1. В Edge UI откройте прокси-сервер, созданный в редакторе прокси-серверов.
  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 в Navigator, вы увидите, что политика была добавлена ​​в этот поток.
  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>

Вы можете добавить элемент <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 мс политика выдает следующую ошибку: 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>
По умолчанию: Никто
Присутствие: Необязательный
Тип: Нить

Пример

См. базовый пример в разделе «Примеры» .

Элемент <Свойства>

Указывает свойство, к которому можно получить доступ из кода 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:

  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 :