本頁內容適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
Python 指令碼政策可讓您在 API Proxy 流程中新增自訂 Python 功能,特別是當您需要的功能超出 Apigee 隨附政策的範圍時。
這項政策是可擴充政策,使用這項政策可能會產生費用或影響用量,具體情況取決於您的 Apigee 授權。如要瞭解政策類型和使用方式的影響,請參閱「政策類型」。
系統會透過 Jython 2.5.2 版提供 Python 語言支援。您新增的第三方程式庫必須是「純 Python」(僅以 Python 實作)。 如要進一步瞭解如何新增程式庫,請參閱「資源檔案」。
Python 政策不含實際程式碼。Python 政策會參照 Python 資源,並定義 Python 指令碼執行的 API 流程步驟。您可以透過 Apigee UI Proxy 編輯器上傳指令碼,也可以將指令碼納入您在本機開發的 API Proxy 的 /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 屬性之外,您也可以在管理 UI 代理程式編輯器中使用不同的自然語言名稱標示政策。
<DisplayName>Policy Display Name</DisplayName>
| 預設 |
不適用 如果省略這個元素,系統會使用政策的 |
|---|---|
| 存在必要性 | 選用 |
| 類型 | 字串 |
<ResourceURL> 元素
這個元素會指定要在 API 流程中執行的主要 Python 檔案。您可以將這個檔案儲存在 API Proxy 範圍內 (位於 API Proxy 套件的 /apiproxy/resources/py 下方,或 API Proxy 編輯器的「Navigator」窗格的「Scripts」部分),也可以儲存在機構或環境範圍內,以便在多個 API Proxy 中重複使用,詳情請參閱「資源檔案」。您的程式碼可以使用 JavaScript 物件模型的物件、方法和屬性。
<ResourceURL>py://myscript.py</ResourceURL>
| 預設值: | 無 |
| 外觀狀態: | 必填 |
| 類型: | 字串 |
<IncludeURL> 元素
指定要載入的 Python 檔案,做為以 <ResourceURL> 元素指定的主要 Python 檔案的依附元件。系統會按照政策中列出的順序評估指令碼。
加入多個 Python 依附元件資源,並包含額外的 <IncludeURL> 元素。
<IncludeURL>py://myscript_dependency.py</IncludeURL>
| 預設值: | 無 |
| 外觀狀態: | 選用 |
| 類型: | 字串 |
錯誤代碼
本部分介绍当此政策触发错误时返回的故障代码和错误消息,以及由 Apigee 设置的故障变量。在开发故障规则以处理故障时,请务必了解此信息。如需了解详情,请参阅您需要了解的有关政策错误的信息和处理故障。
运行时错误
政策执行时可能会发生这些错误。
| 故障代码 | 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>