採用 JavaScript 的 Programming API Proxy

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

在本主題中,您將會瞭解如何使用 JavaScript,以動態方式將 HTTP 標頭新增至 以及如何剖析 JSON 回應,並將一部分屬性傳回給 提出要求的應用程式

下載並試用程式碼範例

關於本教戰手冊範例

這個教戰手冊範例說明在下列環境中實作 API 行為的 API Proxy 模式: JavaScript。JavaScript 範例旨在示範如何使用簡單的變數 和訊息內容以下範例說明如何 getset 變數。第二個 範例說明如何剖析 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 的工作知識。在這個範例中,您將建構 API Proxy 及其政策以及檔案系統上的 XML 檔案。

如果您已下載程式碼範例, 就能找到本 javascript-cookbook 範例資料夾中的所有主題。下列各節將討論 程式碼範例

瞭解 Proxy 流程

如要讓 JavaScript 在 API Proxy 中執行,必須透過政策將 JavaScript 附加至流程 名為「Step」的連結而 JavaScript 類型的政策 (注意大寫) 僅包含 這是 JavaScript 檔案名稱的參照。您可以使用 ResourceURL 元素

舉例來說,下列政策會參照稱為 setHeader.js

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

您可以將這項政策附加至 API Proxy 流程,就像其他政策類型一樣。變更者: 只要在 API Proxy 流程中附加政策,即可指定 JavaScript 執行位置。 這可讓您執行與要求訊息或回應訊息互動的 JavaScript 也就是這些訊息「流動」經由 API Proxy 存取這個範例中的兩個 JavaScript 都會在 回應流程,因為政策會執行兩件事:在回應訊息中設定 HTTP 標頭, 「最小化」Apigee Edge 傳回要求應用程式的回應訊息。

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

選取「Proxy Endpoints」(Proxy 端點) >預設 >導覽器中的 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>

以下是流程的元素摘要。

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

將 JavaScript 程式碼加入 Proxy

JavaScript (例如 Python 指令碼、Java JAR 檔案、XSLT 檔案等) 會以 資源。剛開始使用 JavaScript 時,儲存 API Proxy 中的 JavaScript 檔案。之前,JavaScript 應該是泛型和 可能可以重複使用,再儲存於環境機構層級。 這樣一來,您就不必在多個 API Proxy 中儲存相同的 JavaScript 檔案, 可能很快就會變得難以管理

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

立即試用

如需部署和呼叫 Proxy 的操作說明,請參閱 JavaScript 教戰手冊 README 檔案。

匯入及部署 API Proxy

變更完成後,您可以在 API Proxy 建構工具中「儲存」API Proxy 在管理 UI 中定義這些工具

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

$ sh deploy.sh

測試 JavaScript

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

$ sh invoke.sh

殼層指令碼中會使用 curl 標記 -v,檢視回應的 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 時可能會出現錯誤。這是一種 JavaScript 錯誤格式。 您會看到如下所示的 API Proxy。

{  
   "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 通常可以透過多種方式實作特定功能。使用 盡可能立即使用立即可用的政策,避免有人試圖編寫所有 API Proxy 程式碼 邏輯資料。雖然 Apigee Edge 會利用已編譯的 JavaScript JavaScript 的成效不可能媲美政策。JavaScript 可能是 更難以維護及偵錯為應用程式的特有功能保留 JavaScript Google Cloud 就是最佳選擇

如果對自訂功能有效能考量,請盡可能使用 Java。

摘要

在這個教戰手冊主題中,您已瞭解如何將 JavaScript 置於 API Proxy 中 實作自訂行為樣本實作的自訂行為 示範如何取得和變數,以及如何剖析 JSON 及建構自訂回應 訊息。