Правила в отношении PythonScript

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Что

Правило Python Script позволяет добавить в поток прокси-сервера API настраиваемые функции Python, особенно если вам нужно что-то, что не предусмотрено в стандартных правилах Edge.

Поддержка языка Python обеспечивается с помощью Jython версии 2.5.2. Сторонние библиотеки, которые вы добавляете, должны быть написаны на чистом Python (реализованы только на Python). Подробнее о том, как добавлять библиотеки…

Правило Python не содержит кода. Вместо этого политика Python ссылается на ресурс Python и определяет шаг в потоке API, на котором выполняется скрипт Python. Вы можете загрузить скрипт через прокси-редактор интерфейса управления или включить его в каталог /resources/py в прокси API, которые вы разрабатываете локально.

Примеры

Правила использования Python и скрипт

Правила в отношении скриптов Python

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Script name="Python-1">
        <DisplayName>Python-1</DisplayName>
        <ResourceURL>py://myscript.py</ResourceURL>
</Script>

В этом примере элемент ResourceURL указывает на нужный ресурс скрипта Python.

Скрипт Python

Здесь показано, что можно включить в сам скрипт Python.

import base64

username = flow.getVariable("request.formparam.client_id")
password = flow.getVariable("request.formparam.client_secret")

base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
authorization = "Basic "+base64string

flow.setVariable("authorizationParam",authorization)

Сведения об элементах

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Script name="Python-1">
    <DisplayName>Python-1</DisplayName>
    <ResourceURL>py://myscript.py</ResourceURL>
    <IncludeURL>py://myscript_dependency.py</IncludeURL>
</Script>

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

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

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

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

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

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

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

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

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

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

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

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

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

Элемент <DisplayName>

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

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

Н/Д

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

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

Элемент<ResourceURL>

Этот элемент указывает на основной файл Python, который будет выполняться в потоке API. Вы можете хранить этот файл на уровне прокси API (в разделе /apiproxy/resources/py в пакете прокси API или в разделе "Скрипты" на панели навигации редактора прокси API) или на уровне организации или среды для повторного использования в нескольких прокси API, как описано в разделе Файлы ресурсов. В коде можно использовать объекты, методы и свойства объектной модели JavaScript.

<ResourceURL>py://myscript.py</ResourceURL>
По умолчанию: Нет
Присутствие Обязательно
Тип: Строка

Элемент<IncludeURL>

Указывает файл Python, который нужно загрузить как зависимость для основного файла Python, заданного с помощью элемента <ResourceURL>. Скрипты будут оцениваться в том порядке, в котором они указаны в правиле.

Добавьте несколько ресурсов зависимостей Python с дополнительными элементами <IncludeURL>.

<IncludeURL>py://myscript_dependency.py</IncludeURL>
По умолчанию: Нет
Присутствие Необязательно
Тип: Строка

Коды ошибок

В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые задаются Edge, когда это правило вызывает ошибку. Эта информация важна, если вы разрабатываете правила обработки ошибок. Подробнее о том, что нужно знать об ошибках в правилах и об обработке ошибок…

Ошибки времени выполнения

Эти ошибки могут возникать при выполнении правил.

Код ошибки Статус HTTP Причина Исправить
steps.script.ScriptEvaluationFailed 500 Правило PythonScript может вызывать ошибки ScriptExecutionFailed разных типов. Чаще всего встречаются ошибки NameError и ZeroDivisionError.

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

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

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

Переменные ошибок

Эти переменные задаются, когда правило вызывает ошибку во время выполнения. Подробнее о нарушениях правил…

Переменные Место Пример
fault.name="fault_name" fault_name – название ошибки, указанное в таблице Ошибки выполнения выше. Название ошибки – это последняя часть кода ошибки. fault.name Matches "ScriptExecutionFailed"
pythonscript.policy_name.failed policy_name – заданное пользователем название правила, которое вызвало ошибку. pythonscript.PythonScript-1.failed = true

Пример ответа об ошибке

{
  "fault": {
    "faultstring": "Execution of SetResponse failed with error: Pythonscript runtime error: "ReferenceError: "status" is not defined.\"",
    "detail": {
      "errorcode": "steps.script.ScriptExecutionFailed"
    }
  }
}

Пример правила обработки ошибок

<FaultRule name="PythonScript Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition>
    </Step>
    <Condition>(pythonscript.PythonScript-1.failed = true) </Condition>
</FaultRule>

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