Политика 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 UI.

Исходные файлы JavaScript всегда должны иметь расширение .js .

Информацию о поддерживаемой в настоящее время версии JavaScript см. в разделе Поддерживаемое программное обеспечение и поддерживаемые версии .

Видео

Посмотрите короткое видео, чтобы узнать, как создать собственное расширение политики с помощью политики JavaScript.

Образцы

Перепишите целевой URL

Вот распространенный вариант использования: извлечение данных из тела запроса, сохранение их в переменной потока и использование этой переменной потока в другом месте потока прокси. Допустим, у вас есть приложение, в котором пользователь вводит свое имя в HTML-форму и отправляет ее. Вы хотите, чтобы прокси-сервер API извлекал данные формы и динамически добавлял их в URL-адрес, используемый для вызова внутренней службы. Как бы вы сделали это в политике JavsScript?

Примечание. Если вы хотите опробовать этот пример, мы предполагаем, что вы создали новый прокси в редакторе прокси. При его создании просто укажите 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. Если вы выберете предварительный поток конечной точки прокси-сервера в навигаторе, вы увидите, что политика была добавлена ​​в этот поток.
  9. В навигаторе выберите значок 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 во время выполнения.

Используйте атрибут 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">

Следующие атрибуты относятся только к этой политике.

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

Указывает максимальное время (в миллисекундах), в течение которого разрешено выполнение сценария. Например, если превышен предел в 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() для вывода отладочной информации на панель вывода транзакций в инструменте трассировки. Подробности и примеры см. в разделе Отладка с помощью инструкций print() в JavaScript.

Чтобы просмотреть операторы печати в Trace:

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

  4. Ваши заявления о печати появятся на этой панели.

Вы можете использовать функцию print() для вывода отладочной информации в инструмент Trace . Эта функция доступна непосредственно через объектную модель 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 :