JavaScript 政策

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

結果

這項政策可讓你新增自訂 JavaScript 程式碼,在 API 環境內執行 以及 Proxy 流程在自訂 JavaScript 程式碼中,您可以使用 Apigee Edge JavaScript 物件模型。您可以使用物件模型 變數。個人中心 也可以使用物件模型提供的基本加密編譯函式。

關於

JavaScript 政策有許多用途,舉例來說,您可以取得 執行自訂邏輯並執行錯誤處理、從要求或要求中擷取資料 以及動態編輯後端目標網址等等。這項政策可讓你 實作其他標準 Edge 政策未涵蓋的自訂行為。事實上,您 也能使用 JavaScript 政策來達到其他政策實作的許多相同行為。 例如 AssignMessage 和 ExtractVariable

一個不建議 JavaScript 政策的用途是記錄一種用途。訊息記錄政策有許多 更適合記錄第三方記錄平台,例如 Splunk、Sumo 和 Loggly,以及 只要在 PostClientFlow 中執行 Message Logging 政策,即可改善 API Proxy 效能。 ,在回應傳回用戶端後執行。

JavaScript 政策可讓您指定要執行的 JavaScript 來源檔案,或是 您可以直接使用 <Source>,直接在政策設定中加入 JavaScript 程式碼 元素。 無論選擇哪一種方式,JavaScript 程式碼都會在執行附加政策的步驟時執行。 對於來源檔案選項,原始碼一律會儲存在 Proxy 組合中的標準位置:apiproxy/resources/jsc。您還能 將原始碼儲存在環境或機構層級的資源檔案中。適用對象 操作說明,請參閱「資源檔案」一節。你可以 也能透過 Apigee UI Proxy 編輯器上傳 JavaScript。

JavaScript 來源檔案一律必須具有 .js 副檔名。

請參閱支援的軟體和支援的版本 瞭解系統目前支援的 JavaScript 版本。

影片

請觀看短片,瞭解如何使用 JavaScript 建立自訂政策擴充功能 政策。

範例

重寫目標網址

以下為常見的用途:從要求主體擷取資料,然後儲存在流程中 變數,並在 Proxy 流程的其他位置使用該流程變數。假設您有一款應用程式 使用者在 HTML 表單中輸入自己的姓名並提交。您希望 API Proxy 擷取表單資料,並以動態方式將其新增至用於呼叫後端服務的網址。做法 這項規定適用於 JavsScript 政策嗎?

注意:如果您要試用這個範例,我們假設您已建立新的 Proxy 編輯器中。建立服務帳戶時,只需為其提供如下的後端服務網址: http://www.example.com。在這個範例中,我們要動態重寫後端網址。 如果您不知道如何建立新的 Proxy,請參閱入門教學課程。。

  1. 在 Edge UI 中,開啟您在 Proxy 編輯器中建立的 Proxy。
  2. 選取「開發」分頁標籤。
  3. 在「新增」選單中選取「新增指令碼」
  4. 在對話方塊中選取「JavaScript」並為指令碼命名,例如: js-example
  5. 將下列程式碼貼入程式碼編輯器,並儲存 Proxy。請注意 名稱為 context 物件這個物件可供 JavaScript 程式碼使用 都會存取 Proxy 流程中的任何位置可用來取得流程專屬的常數 get/set 方法和更多作業這個物件部分屬於 Edge JavaScript 物件模型。注意: 此外,target.url 流程變數也是內建的讀取/寫入變數, 您可以在目標要求流程中存取。當我們使用 API 網址設定該變數時,Edge 會對該網址進行後端呼叫我們重新編寫了原始的目標網址 也就是您在建立 Proxy 時指定的任何值 (例如 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」JavaScript
  7. 為政策命名,例如 target-rewrite。接受預設值,然後儲存 政策。
  8. 如果您在 Navigator 中選取 Proxy Endpoint Preflow,就會看到 加入至該流程
  9. 在導覽工具中,選取「Target Endpoint PreFlow」(目標端點 PreFlow) 圖示。
  10. 從導覽器中,將 JavaScript 政策拖曳到目標的要求端 流程編輯器中的端點。
  11. 像這樣呼叫 API,並將正確的機構名稱和 Proxy 名稱替換成 適當:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

最後,我們來看看 JavaScript 政策中所使用的 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> 元素,然後擷取 元素值。

使用元素的 name 屬性來指定存取 擷取及儲存大量屬性<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 建議的最佳做法。


元素參照

元素參考資料將說明 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>

&lt;Javascript&gt;屬性

<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> 元素,為政策加上標籤: 管理使用者介面 Proxy 編輯器,使用不同的自然語言名稱。

不適用 必填
continueOnError

如果設為「false」,系統會在政策失敗時傳回錯誤。這是可預期的情況 大多數政策的行為

如果設為 true,即使政策已發生,流程執行作業仍會繼續執行 失敗。

false 選用
enabled

如要強制執行政策,請設為 true

設為 false 即可停用政策。這項政策不會 仍會強制執行 政策。

true 選用
async

此屬性已淘汰。

false 已淘汰

&lt;DisplayName&gt;元素

name 屬性外,一併使用 管理 UI Proxy 編輯器,使用不同的自然語言名稱。

<DisplayName>Policy Display Name</DisplayName>
預設

不適用

如果省略這個元素,政策的 name 屬性值會是

存在必要性 選用
類型 字串

&lt;IncludeURL&gt;元素

指定要載入做為主要 JavaScript 檔案的依附元件的 JavaScript 程式庫檔案 透過 <ResourceURL><Source> 元素指定。系統會在 政策中列出的順序。您的程式碼可以使用各種物件、方法和 JavaScript 物件模型的屬性。

加入多個含有額外項目的 JavaScript 依附元件資源 <IncludeURL> 元素。

<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
預設:
所在地: 選用
類型: 字串

範例

請參閱「範例」一節中的基本範例。

&lt;Property&gt;元素

指定您可以在執行階段從 JavaScript 程式碼存取的屬性。

<Properties>
    <Property name="propName">propertyValue</Property>
</Properties>
預設:
所在地: 選用
類型: 字串

屬性

屬性 說明 預設 存在必要性
名稱

指定屬性的名稱。

不適用 必填。

範例

請參閱「範例」一節中的範例。

&lt;ResourceURL&gt;元素

指定要在 API 流程中執行的主要 JavaScript 檔案。您可以儲存這個檔案 在 API Proxy 範圍 (在 API Proxy 套件中的 /apiproxy/resources/jsc 下,或 API Proxy 編輯器「Navigator」窗格的「Scripts」部分,或在機構層級 環境範圍,以便在多個 API Proxy 中重複使用,如「資源檔案」所述。程式碼可以使用物件 JavaScript 物件模型的方法以及屬性。

<ResourceURL>jsc://my-javascript.js</ResourceURL>
預設:
所在地: 必須提供 <ResourceURL><Source>。如果 <ResourceURL><Source> 兩者皆是,<ResourceURL>會遭到忽略。
類型: 字串

範例

請參閱「範例」一節中的基本範例。

&lt;Source&gt;元素

允許您將 JavaScript 直接插入政策的 XML 設定中。插入 在 API 流程中執行政策時,系統會執行 JavaScript 程式碼。

預設:
所在地: 必須提供 <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>

&lt;SSLInfo&gt;元素

為由 Proxy 建立的所有 HTTP 用戶端執行個體,指定用於設定 TLS 的屬性 JavaScript 政策。

    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
預設:
所在地: 選用
類型: 字串

為 HTTP 用戶端設定 TLS 的程序與設定 TLS 的程序相同 TargetEndpoint/TargetServer 的 TLS。 請參閱設定從 Edge 到後端的 TLS。 瞭解詳情

使用須知

JavaScript 政策不含任何實際程式碼。相反地,JavaScript 政策會參照 JavaScript 的「資源」,並且定義執行 JavaScript 的 API 流程步驟。你可以 透過管理使用者介面 Proxy 編輯器上傳指令碼,也可以將指令碼加入 /resources/jsc 目錄 (位於本機開發的 API Proxy 中)。

對 JavaScript 政策程式碼進行偵錯

使用 print() 函式將偵錯資訊輸出至交易 輸出面板如需詳細資訊和範例,請參閱「使用 JavaScript 偵錯」 print() 陳述式。

如要在 Trace 中查看列印陳述式,請按照下列步驟操作:

  1. 開啟追蹤工具,然後為含有 JavaScript 的 Proxy 啟動追蹤工作階段 政策。
  2. 呼叫 Proxy。
  3. 在追蹤記錄工具中,按一下「Output from all Transactions」(所有交易的輸出) 以開啟輸出內容。 面板。

  4. 你的輸出對帳單會顯示在這個面板中。

您可以使用 print() 函式將偵錯資訊輸出至「追蹤工具」。這個函式可直接使用 讀取及傳遞資訊詳情請參閱「使用 print() 對 JavaScript 進行偵錯 Statement

流程變數

在預設情況下,這項政策不會填入任何變數。不過,您可以設定 只要在結構定義物件上呼叫方法,即可在 JavaScript 程式碼中測試變數。典型模式 如下所示:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))

結構定義物件是 Apigee Edge JavaScript 物件模型的一部分。

錯誤參考資料

本節說明系統傳回的錯誤代碼和錯誤訊息,以及錯誤變數。 這項政策觸發錯誤時,由 Edge 設定的。請務必瞭解 您必須制定錯誤規則 處理錯誤詳情請參閱這篇文章 瞭解政策錯誤處理方式 發生錯誤

執行階段錯誤

執行政策時,可能會發生這些錯誤。

錯誤程式碼 HTTP 狀態 原因 修正
steps.javascript.ScriptExecutionFailed 500 JavaScript 政策可能會擲回多種類型的 ScriptExecutionFailed 錯誤。經常 錯誤訊息類型包括 RangeError ReferenceError, SyntaxErrorTypeError,且 URIError
steps.javascript.ScriptExecutionFailedLineNumber 500 JavaScript 程式碼發生錯誤。詳情請參閱錯誤字串。 不適用
steps.javascript.ScriptSecurityError 500 執行 JavaScript 時發生安全性錯誤。請參閱錯誤字串 詳細資料。 不適用

部署錯誤

當您部署含有這項政策的 Proxy 時,可能會發生這些錯誤。

錯誤名稱 原因 修正
InvalidResourceUrlFormat 如果 <ResourceURL> 或 JavaScript 政策的 <IncludeURL> 元素中指定的資源網址格式無效,API Proxy 部署作業就會失敗。
InvalidResourceUrlReference 如果 <ResourceURL><IncludeURL> 元素 參照不存在的 JavaScript 檔案,API Proxy 的部署就會失敗。 參照的來源檔案必須存在 API Proxy、環境或機構層級。
WrongResourceType 如果 <ResourceURL><IncludeURL>,則在部署期間發生這個錯誤 JavaScript 政策的元素會參照 jsc (JavaScript 檔案) 以外的任何資源類型。
NoResourceURLOrSource 如果 <ResourceURL> ,或是未在這個元素中定義資源網址。 <ResourceURL> 元素是必要元素。或者,系統會宣告 <IncludeURL> 元素 但這個元素中並未定義資源網址。<IncludeURL> 為選用元素 但如果已宣告,就必須在 <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 參閱這些相關文章 社群