您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
什麼是 Java 呼叫?
Apigee Edge 提供一系列政策,可滿足常見的 API 管理需求,例如安全性、資料轉換、流量管理等。
不過,在某些情況下,您的 API 需要自訂行為,但標準政策並未實作這類行為。在這種情況下,Apigee 提供多種選項,讓您編寫指令碼或程式碼,自訂 API 行為。其中一種做法是在 Java 中實作所需行為。
如要瞭解支援的 Java 版本,請參閱「支援的軟體和支援的版本」。
如何在 Proxy 中使用 Java 程式碼?
Java 呼叫政策可讓您在執行中的 Proxy 流程中呼叫 Java 程式碼。您的 Java 程式碼必須實作特定的 Edge 專用 Java 介面,才能與執行的 Proxy 互動。舉例來說,Java 方法可用於取得及設定標頭、查詢參數、流程變數,以及 Proxy 目前流程情境中的其他實體。
何時該使用 Java 呼叫?
我們來看看 Java 呼叫的適用情境,以及您應考慮其他做法的情境。
首先,請考慮替代方法
使用 Java 註解前,請注意您可能可以改用其他方法。例如:
- 如要執行輕量型作業 (例如對遠端服務發出 HTTP API 呼叫),請考慮使用 ServiceCallout 政策。請參閱服務呼叫政策。
- 如要與訊息內容進行相對簡單的互動,例如修改或擷取 HTTP 標頭、參數或訊息內容,可以使用 JavaScript 或 Python 語言。
Java 程式碼可執行的操作
Java 呼叫支援下列基本作業:
- 檢查或操控要求或回應訊息
- 取得及設定流程變數。您可以使用 Java 方法存取 Edge 流程變數。 如要存取鍵/值對應 (KVM) 資訊,請使用 KVM 政策,將 KVM 值指派給流程變數,然後從 Java 呼叫內存取流程變數。
- 呼叫外部服務
- 提出錯誤
- 操控錯誤訊息和狀態碼
Java 程式碼中無法執行的操作
大多數系統呼叫都不允許。您無法:
- 讀取或寫入內部檔案系統。也就是說,您無法使用任何 Java 套件讀取/寫入內部檔案系統,但可以進行外部遠端呼叫。
- 取得機器上目前程序、程序清單或 CPU/記憶體使用率的相關資訊。
- 存取 `expressions-1.0.0.jar` 和 `message-flow-1.0.0.jar` 中的原始碼。
雖然部分這類通話可能可以進行,但我們不支援這類通話,且隨時可能主動停用。請避免在程式碼中發出這類呼叫。
請勿使用或依賴 Apigee Edge 隨附的 Java 程式庫。這些程式庫僅適用於 Edge 產品功能,且無法保證每個版本都會提供程式庫。如果您使用這類程式庫,請僅在非正式環境示範中使用。
Hello Java 呼叫
我們來逐步瞭解基本的 Hello World Java 呼叫範例。在本範例中,我們建立簡單的 Proxy,並使用 Java 呼叫,傳回「hello world」回應。Proxy 可能會傳回下列其中一種回應:
- 如果您傳遞含有「name」值的「username」標頭,Proxy 會傳回:
Hello, <name>!
- 如果省略標頭,Proxy 只會傳回:
"Hello, Guest!"
下載範例專案
為簡化作業,我們在 GitHub 的 Apigee api-platform-samples 存放區中,為您準備了基本專案。
- 將 api-platform-samples 下載或複製到您的系統。
- 在所選的終端機或程式碼編輯器中,前往
api-platform-samples/doc-samples/java-hello專案。
編寫 Java 程式碼
- 開啟 Java 來源檔案:
java-hello/callout/src/main/java/HelloJava.java。 這個檔案是我們將實作的主要 Java 類別的架構版本。Edge Java Callout 程式碼必須匯入這些套件。這些類別提供的方法可讓您存取 Proxy 執行環境。我們很快就會逐步說明如何編譯及部署這段程式碼。
package com.apigeesample; import com.apigee.flow.execution.ExecutionContext; import com.apigee.flow.execution.ExecutionResult; import com.apigee.flow.execution.spi.Execution; import com.apigee.flow.message.MessageContext; public class HelloJava implements Execution { public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) { try { // Your code here. return ExecutionResult.SUCCESS; } catch (Exception e) { return ExecutionResult.ABORT; } } }
- 將註解行
// Your code here替換為下列程式碼:
String name = messageContext.getMessage().getHeader("username"); if (name != null && name.length()>0) { messageContext.getMessage().setContent("Hello, " + name + "!"); messageContext.getMessage().removeHeader("username"); } else { messageContext.getMessage().setContent("Hello, Guest!"); }
- 儲存檔案。
使用 Maven 編譯程式碼
專案已設定完成,因此您可以使用 Maven 進行編譯。如要使用 javac,我們會在 Maven 範例後提供範例。
- 請確認已安裝 Maven:
mvn -version
- 執行指令碼
java-hello/buildsetup.sh。這段指令碼會在您的本機 Maven 存放區中安裝必要的 JAR 依附元件。 - cd 至
java-hello/callout目錄。 - 執行 Maven:
mvn clean package
- 如要確認 JAR 檔案
edge-custom-policy-java-hello.jar是否已複製到java-hello/apiproxy/resources/java,這是要透過 Proxy 部署的 JAR 檔案必要位置。
使用 javac 編譯 (選用)
在上一個部分中,您使用 Maven 指令自動產生必要的 Java JAR 檔案。或者,如要使用 javac 編譯程式碼,可以執行類似下列的動作 (從 java-hello 目錄)。系統會在 java-hello/lib 目錄中提供必要的 JAR 檔案。
- cd 到
api-platform-samples/doc-samples/java-hello。 - 請確認路徑中含有 javac。
javac -version
- 執行下列 javac 指令:
這會建立javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/HelloJava.java
com/apigeesample/HelloJava.class。 - 在
apiproxy/resources/java目錄中建立含有已編譯類別的 JAR 檔案。這是要透過 Proxy 部署的 JAR 檔案必要位置。如要這麼做,請在java-hello目錄中執行下列指令 (別忘了結尾的句點)。
jar cvf apiproxy/resources/java/edge-custom-policy-java-hello.jar -C com .
部署及呼叫 Proxy
./java-hello 目錄中提供部署指令碼。但執行前,請先完成快速設定。
- cd 至
api-platform-samples/doc-samples/java-hello - 如果尚未開啟檔案
../../setup/setenv.sh並編輯,請按照指示使用 Apigee 帳戶資訊編輯檔案:使用者名稱 (與帳戶相關聯的電子郵件地址)、機構名稱,以及用於發出 API 管理呼叫的網域。舉例來說,Edge Cloud 的網域是https://api.enterprise.apigee.com,但如果您使用 Edge Private Cloud,網域可能會有所不同。 - 儲存
setenv.sh檔案。 - 執行部署指令碼:
./deploy.sh
- 如果部署成功,請執行叫用指令碼:
./invoke.sh
叫用指令碼會呼叫類似下列的 cURL 指令:
curl http://$org-$env.$api_domain/java-hello -H "username:Will"
這會傳回「Hello, Will!
您可以編輯
invoke.sh指令碼來變更名稱,也可以變更 cURL 呼叫來移除標頭,這樣指令就會傳回「Hello, Guest!」。
關於 Proxy
讓我們快速檢查這個 Proxy 中使用的政策。請注意政策在 Proxy 流程中的位置和原因。
AssignMessage 政策
AssignMessage 政策會附加至 ProxyEndpoint 要求流程。這個中介軟體會從要求複製使用者名稱標頭,並指派給回應。這項作業可讓附加至回應流程的 Java Callout 政策存取使用者名稱標頭,並使用該標頭的值建構自訂回應內文。
<AssignMessage async="false" continueOnError="false" enabled="true" name="CopyHeader"> <DisplayName>CopyHeader</DisplayName> <Copy source="request"> <Headers> <Header name="username"/> </Headers> </Copy> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Java 呼叫政策
Java 呼叫政策會附加至回應流程。這是因為自訂 Java 程式碼會變更回應標頭和訊息。政策的 ClassName 元素會指定政策執行的主要類別。ResourceURL 元素是您建構並新增至 Proxy resources/java 目錄的 JAR 檔案名稱。
<JavaCallout name="hello-java"> <ClassName>com.apigeesample.HelloJava</ClassName> <ResourceURL>java://edge-custom-policy-java-hello.jar</ResourceURL> </JavaCallout>
Java 呼叫注意事項
實作 Java 呼叫時,請注意以下幾點重要事項:
- 從
com.apigee.flow.execution和com.apigee.flow.message套件匯入類別。這些套件必須包含在封裝及部署的 JAR 檔案中。您可以透過管理 UI 代理編輯器上傳 Java JAR,也可以將其納入您在本機開發的 API 代理中的/resources/java目錄。 - 實作 Execution 介面。在 API Proxy 中執行的任何 Java 程式碼,都必須實作 Execution。
- Java 呼叫政策不含實際程式碼。Java Callout 政策會參照 Java「資源」,您必須將該資源封裝在 JAR 中。
- 應避免的套件名稱:請勿在 Java Callout 中使用 io.apigee 或 com.apigee 做為套件名稱。這些保留字供其他 Apigee 模組使用。
- 如果 Java Callout 依附於以獨立 JAR 檔案封裝的其他第三方程式庫,請將這些 JAR 檔案也放在
/resources/java目錄中,確保這些檔案在執行階段能正確載入。 - 如有其他 JAR,只要新增為額外資源即可。您不需要修改政策設定,即可參照其他 JAR 檔案。將這些檔案放在
/resources/java中即可。 - 如要進一步瞭解如何上傳 Java JAR,請參閱「資源檔案」。