採用 JavaScript 的 Programming API Proxy

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

本主題將說明如何使用 JavaScript,動態將 HTTP 標頭新增至回應訊息,以及如何剖析 JSON 回應,並將部分屬性傳回給提出要求的應用程式。

下載並試用程式碼範例

關於本教戰手冊範例

本食譜範例說明 API Proxy 模式,您可以在其中以 JavaScript 實作 API 行為。這些 JavaScript 範例旨在說明如何使用簡單的變數和訊息內容。其中一個範例說明如何取得設定變數。第二個範例說明如何剖析 JSON,並從結果建構訊息。

API Proxy 中有兩個 JavaScript 範例:

  • setHeaders.js:這個 JavaScript 會取得 API Proxy 叫用時設定的幾個變數值。JavaScript 會將這些變數新增至回應訊息,方便您查看每個要求的值。
  • minimize.js:這段 JavaScript 會說明如何處理訊息內容。這個範例背後的概念是,服務通常會傳回超出必要範圍的資料。因此,JavaScript 會剖析回應訊息、擷取幾個有趣的屬性,然後使用這些屬性建構回應訊息的內容。

setHeader.js 的程式碼:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

minimize.js 的程式碼:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

您可以在 JavaScript 中透過內容物件存取流程變數。這個物件是 Edge JavaScript 物件模型的一部分。如要進一步瞭解物件模型,請參閱「JavaScript 物件模型」。

事前準備

在探索這個食譜範例之前,您也應該熟悉下列基本概念:

  • 瞭解政策,以及如何將政策附加至 Proxy。如要瞭解政策的相關基本概念,請參閱「什麼是政策?」一文。
  • Proxy 流程的結構,如「設定流程」一文所述。流程可讓您指定 API Proxy 執行政策的順序。在本範例中,系統會建立多項政策,並新增至 API Proxy 流程。
  • API Proxy 專案在檔案系統中的組織方式,如「API Proxy 設定參考資料」一文所述。
  • 具備 XML、JSON 和 JavaScript 的實用知識。在本範例中,您會使用檔案系統中的 XML 檔案,建構 API Proxy 及其政策。

如果您已下載程式碼範例,可以在 javascript-cookbook 範例資料夾中找到本主題討論的所有檔案。以下各節將詳細說明程式碼範例。

瞭解 Proxy 流程

如要讓 JavaScript 在 API Proxy 中執行,必須使用名為「步驟」的政策附件,將 JavaScript 附加至流程。Javascript 類型的政策 (請注意大小寫) 只會包含對 JavaScript 檔案名稱的參照。使用 ResourceURL 元素將政策指向 JavaScript 檔案。

舉例來說,下列政策會參照名為 setHeader.js 的 JavaScript 檔案。

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

您可以將這項政策附加至 API Proxy 流程,做法與其他政策類型相同。將政策附加至 API Proxy 流程,即可指出應執行 JavaScript 的位置。這樣一來,您就能執行 JavaScript,與流經 API Proxy 的要求訊息或回應訊息互動。在本例中,由於政策會執行兩項作業:在回應訊息中設定 HTTP 標頭,以及「縮小」Apigee Edge 傳回給要求應用程式的回應訊息,因此這兩個 JavaScript 都會在回應流程中執行。

如果您在管理 UI 中開啟這項流程設定,會看到下列流程設定。

在「Navigator」窗格中,依序選取「Proxy Endpoints」>「default」>「PostFlow」

下方顯示名為「default」的 ProxyEndpoint 對應 XML 設定。

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

以下是流程元素的摘要。

  • <Request> - <Request> 元素由多個 <Step> 元素組成。每個步驟都會呼叫您透過本主題其餘部分建立的其中一項政策。這些政策會將 JavaScript 附加至 API Proxy 流程,而政策附加位置會決定 JavaScript 的執行時間。
  • <Response> - <Response> 元素也包含 <Steps>。這些步驟也會呼叫負責處理目標最終回應的政策 (在本範例中,目標是 Apigee 的模擬服務目標 - 請注意 /apiproxy/targets/default.xml 中的 HTTPTargetConnection 設定)。
  • <HTTPProxyConnection>:指定主機和 URI 路徑,定義應用程式呼叫以使用這個 API 的網路位址。
  • <RouteRule>:這個元素會指定 ProxyEndpoint 叫用哪個 TargetEndpoint 設定。

在 Proxy 中加入 JavaScript 程式碼

JavaScript (例如 Python 指令碼、Java JAR 檔案、XSLT 檔案等) 會儲存為資源。剛開始使用 JavaScript 時,最簡單的方法是將 JavaScript 檔案儲存在 API Proxy 中。隨著進度推進,JavaScript 應盡可能通用且可重複使用,然後儲存在環境機構層級。這樣一來,您就不必在多個 API Proxy 中儲存相同的 JavaScript 檔案,以免檔案數量過多而難以管理。

如要瞭解如何在機構和環境層級儲存資源,請參閱「資源檔案」。

試試看

如需部署及呼叫 Proxy 的操作說明,請參閱 JavaScript 食譜 README

匯入及部署 API Proxy

變更完成後,您可以在管理 UI 的 API Proxy 建構工具中儲存 API Proxy。

或者,您可以在目錄 /api-platform-samples/doc-samples/javascript-cookbook 中執行下列指令。

$ sh deploy.sh

測試 JavaScript

/api-platform-samples/doc-samples/javascript-cookbook 目錄中執行下列指令。

$ sh invoke.sh

殼層指令碼會使用 curl 標記 -v,查看 JavaScript 修改後的回應訊息中的 HTTP 標頭。

您可以直接按照下列步驟提出要求:

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

如果 JavaScript 正常執行,您會看到類似以下的回應:

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

您現在可以修改 JavaScript 嘗試新功能、重新部署 API Proxy,並提交相同要求來驗證結果。請務必部署含有 JavaScript 的 API Proxy,變更才會生效。

指令碼錯誤

撰寫 JavaScript 時,您難免會遇到錯誤。API Proxy 發出的 JavaScript 錯誤格式如下所示。

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

何時使用 JavaScript

在 Apigee Edge 中,通常有多種方法可實作特定功能。請盡可能使用現成政策,並避免以 JavaScript 編寫所有 API Proxy 邏輯。雖然 Apigee Edge 會運用已編譯的 JavaScript 來提升效能,但 JavaScript 的效能不太可能與政策一樣好。JavaScript 可能較難維護及偵錯。請保留 JavaScript,用於滿足您需求的獨特功能。

如果自訂功能有成效方面的問題,請盡可能使用 Java。

摘要

在本食譜主題中,您瞭解如何在 API Proxy 設定中加入 JavaScript,以實作自訂行為。這些範例實作的自訂行為,示範如何取得變數,以及如何剖析 JSON 和建構自訂回覆訊息。