您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
如果您是首次使用 Java 调用程序,我们建议您从如何创建 Java 调用程序开始。
本实战宝典示例演示了如何创建在代理流上下文中执行自定义 Java 代码的简单 JavaCallout 政策。
示例代码的作用是什么?
此示例中的 API 代理调用一个返回简单 JSON 响应的目标服务。Java 调用程序政策位于目标响应流中。Java 代码会将响应的标头和内容转换为大写字母。这是一个简单的示例,不过它说明了如何使自定义 Java 代码在 Edge 上的 API 代理上下文中正常运行。
试用示例
下载项目
为了简化操作,您可以从 GitHub 上的 Apigee api-platform-samples 代码库下载此项目。
- 将 api-platform-samples 下载或克隆到您的系统中。
- 在您选择的终端或代码编辑器中,转到
api-platform-samples/doc-samples/java-cookbook
项目。
使用 Maven 编译代码
项目设置完毕,可以使用 Maven 进行编译。如果您想使用 javac
,我们还将参照 Maven 示例。
- 确保您已安装 Maven:
mvn -version
- 执行脚本
java-cookbook/buildsetup.sh
。此脚本会在本地 Maven 代码库中安装所需的 JAR 依赖项。 - 使用 cd 命令转到
java-cookbool/callout
目录。 - 执行 Maven:
mvn clean package
- 如果需要,请验证 JAR 文件
edge-custom-policy-java-cookbook.jar
是否已复制到java-cookbook/apiproxy/resources/java
。要使用代理部署的 JAR 文件必须存放在该位置。
使用 javac 编译
如果您要使用 javac
编译代码,可以从 java-cookbook
目录执行类似如下的操作。java-cookbook/lib
目录中提供了所需的 JAR 文件。
- 使用 cd 命令转到
api-platform-samples/doc-samples/java-cookbook
。 - 确保您的路径中包含 javac。
javac -version
- 执行以下 javac 命令:
javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/ResponseUppercase.java
- 将 JAR 文件复制到 apiproxy/resources/java 目录。要使用代理部署的 JAR 文件必须存放在该位置。
cp com/apigeesample/ResponseUppercase.class apiproxy/resources/java
部署和调用代理
./java-cookbook
目录中提供了部署脚本。但在运行之前,您需要进行一项快速设置。
- 使用 cd 命令转到
api-platform-samples/doc-samples/java-cookbook
- 打开文件
../../setup/setenv.sh
,然后按照 Apigee 帐号信息的指示进行修改:您的用户名(与您的帐号关联的电子邮件地址)、您的组织名称,以及您用于进行 API 管理调用的网域。例如,对于 Edge Cloud,网域为https://api.enterprise.apigee.com
;但是,如果您使用的是 Edge Private Cloud,则您的网域可能会有所不同。 - 保存
setenv.sh
文件。 - 执行部署脚本:
./deploy.sh
- 如果部署成功,请执行调用脚本:
./invoke.sh
调用脚本会调用如下所示的 c网址 命令:
curl http://$org-$env.$api_domain/java-cookbook/json
响应如下所示:
< HTTP/1.1 200 OK < Date: Tue, 09 May 2017 20:31:08 GMT < Content-Type: APPLICATION/JSON; CHARSET=UTF-8 < Content-Length: 68 < Connection: keep-alive < Access-Control-Allow-Origin: * < ETag: W/"44-RA5ERT/MMLIK54NVBWBSZG" < X-Powered-By: APIGEE < Server: Apigee Router < * Curl_http_done: called premature == 0 * Connection #0 to host willwitman-test.apigee.net left intact {"FIRSTNAME":"JOHN","LASTNAME":"DOE","CITY":"SAN JOSE","STATE":"CA"}
代理流程
轨迹工具的截图显示了代理流程:
代理结构
这是代理的结构。请注意,它在 apiproxy/resources/java
目录中包含一个 JAR 文件。JAR 是必需的。我们在示例中提供该模板,但如果您要执行自定义工作,则需要自行构建并将其复制到此位置。如需有关编译和部署 Java 调用程序的指导,请参阅如何创建 Java 调用程序。
java-cookbook apiproxy java-cookbook.xml policies responseUppercase.xml proxies default.xml resources java ResponseUppercase.jar targets default.xml
关于 Java 代码
Java 调用程序政策运行以下 Java 代码,该代码会将响应标头和响应正文转换为大写。请注意,该程序使用 Apigee 专用的软件包。这些软件包提供了可用于直接与代理流交互的对象和方法。您可以通过一些方法获取和设置流变量、标头、邮件内容等。
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; import java.util.Set; public class ResponseUppercase implements Execution{ public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) { try { Set headers = messageContext.getMessage().getHeaderNames(); for (String header : headers) { String h = messageContext.getMessage().getHeader(header).toUpperCase(); messageContext.getMessage().setHeader(header, h); } String content = messageContext.getMessage().getContent(); messageContext.getMessage().setContent(content.toUpperCase()); return ExecutionResult.SUCCESS; } catch (Exception e) { return ExecutionResult.ABORT; } } }
检查示例代理
您需要自行打开代理并检查文件。以下是 Java 调用程序政策。 请注意它如何引用调用程序执行的类和 JAR 文件。所有 Java 调用程序政策都遵循此模式。另请参阅 Java 调用程序政策。
<JavaCallout name="responseUppercase"> <ClassName>com.apigeesample.ResponseUppercase</ClassName> <ResourceURL>java://ResponseUppercase.jar</ResourceURL> </JavaCallout>