<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
内容
通过 Python 脚本政策,您可以向 API 代理流添加自定义 Python 功能, 特别是在您需要的功能超出了 Edge 的开箱即用政策范围时 提供。
Python 语言支持通过 Jython 2.5.2 版提供。您添加的第三方库必须为“纯 Python”(即仅用 Python 实现的库)。 如需详细了解如何添加库,请参阅资源文件。
Python 政策不包含实际代码。相反,Python 政策会引用 Python 资源,并在执行 Python 脚本的 API 流中定义步骤。您可以上传
通过管理界面代理编辑器运行脚本,也可以将脚本添加到
/resources/py
目录。
示例
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 |
政策的内部名称。 (可选)使用 |
不适用 | 必填 |
continueOnError |
设置为 设置为 |
false | 可选 |
enabled |
设置为 设为 |
是 | 可选 |
async |
此特性已弃用。 |
false | 已弃用 |
<DisplayName> 元素
除了用于 name
属性之外,还可以用于在管理界面代理编辑器中给政策添加不同的自然语言名称标签。
<DisplayName>Policy Display Name</DisplayName>
默认 |
不适用 如果省略此元素,则会使用政策的 |
---|---|
状态 | 可选 |
类型 | 字符串 |
<ResourceURL> 元素
该元素指定将在 API 流中执行的主要 Python 文件。您可以在 API 代理范围(API 代理软件包的 /apiproxy/resources/py
下方或 API 代理编辑器导航工具窗格的“脚本”部分中)或组织或环境范围中存储此文件,以便在多个 API 代理中重复使用,如资源文件中所述。您的代码可以使用 JavaScript 对象模型的对象、方法和属性。
<ResourceURL>py://myscript.py</ResourceURL>
默认: | 无 |
状态: | 必填 |
类型: | 字符串 |
<IncludeURL> 元素
指定要作为使用 <ResourceURL>
元素指定的主要 Python 文件的依赖项加载的 Python 库文件。脚本将按政策中的列出顺序进行评估。
使用附加 <IncludeURL>
元素添加多个 Python 依赖项资源。
<IncludeURL>py://myscript_dependency.py</IncludeURL>
默认: | 无 |
状态: | 可选 |
类型: | 字符串 |
错误代码
本部分介绍返回的错误代码、错误消息以及故障变量 在此政策触发错误时由 Edge 设置的值。在开发故障规则以处理故障时,请务必了解此信息。如需了解详情,请参阅您需要了解的有关政策错误的信息和处理故障。
运行时错误
政策执行时可能会发生这些错误。
故障代码 | HTTP 状态 | 原因 | 修复 |
---|---|---|---|
steps.script.ScriptEvaluationFailed |
500 | PythonScript 政策可能会引发几种不同的 ScriptExecutionFailed 错误。经常 错误的类型包括 NameError 和 ZeroDivisionError。 | build |
部署错误
在您部署包含此政策的代理时,可能会发生这些错误。
错误名称 | 原因 | 修复 |
---|---|---|
InvalidResourceUrlFormat |
如果 PythonScript 政策的 <ResourceURL> 或 <IncludeURL> 元素中指定的资源网址格式无效,则 API 代理的部署将失败。 |
build |
InvalidResourceUrlReference |
如果 <ResourceURL> 或 <IncludeURL> 元素引用了不存在的 PythonScript 文件,则 API 代理的部署将失败。引用的源文件必须存在于 API 代理、环境或组织级别。 |
build |
故障变量
当此政策在运行时触发错误时,将设置这些变量。如需了解详情,请参阅您需要了解的有关政策错误的信息。
变量 | 地点 | 示例 |
---|---|---|
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>