使用 Java 调用程序将响应转换为大写

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

如果您是首次使用 Java 调用程序,我们建议您从如何创建 Java 调用程序开始。

本实战宝典示例演示了如何创建在代理流上下文中执行自定义 Java 代码的简单 JavaCallout 政策

示例代码的作用是什么?

此示例中的 API 代理调用一个返回简单 JSON 响应的目标服务。Java 调用程序政策位于目标响应流中。Java 代码会将响应的标头和内容转换为大写字母。这是一个简单的示例,不过它说明了如何使自定义 Java 代码在 Edge 上的 API 代理上下文中正常运行。

试用示例

下载项目

为了简化操作,您可以从 GitHub 上的 Apigee api-platform-samples 代码库下载此项目。

  1. api-platform-samples 下载或克隆到您的系统中。
  2. 在您选择的终端或代码编辑器中,转到 api-platform-samples/doc-samples/java-cookbook 项目。

使用 Maven 编译代码

项目设置完毕,可以使用 Maven 进行编译。如果您想使用 javac,我们还将参照 Maven 示例。

  1. 确保您已安装 Maven:
    mvn -version
    
  2. 执行脚本 java-cookbook/buildsetup.sh。此脚本会在本地 Maven 代码库中安装所需的 JAR 依赖项。
  3. 使用 cd 命令转到 java-cookbool/callout 目录。
  4. 执行 Maven:
    mvn clean package
    
  5. 如果需要,请验证 JAR 文件 edge-custom-policy-java-cookbook.jar 是否已复制到 java-cookbook/apiproxy/resources/java。要使用代理部署的 JAR 文件必须存放在该位置。

使用 javac 编译

如果您要使用 javac 编译代码,可以从 java-cookbook 目录执行类似如下的操作。java-cookbook/lib 目录中提供了所需的 JAR 文件。

  1. 使用 cd 命令转到 api-platform-samples/doc-samples/java-cookbook
  2. 确保您的路径中包含 javac。

    javac -version
    
  3. 执行以下 javac 命令:

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/ResponseUppercase.java
    
  4. 将 JAR 文件复制到 apiproxy/resources/java 目录。要使用代理部署的 JAR 文件必须存放在该位置。

    cp com/apigeesample/ResponseUppercase.class apiproxy/resources/java
    

部署和调用代理

./java-cookbook 目录中提供了部署脚本。但在运行之前,您需要进行一项快速设置。

  1. 使用 cd 命令转到 api-platform-samples/doc-samples/java-cookbook
  2. 打开文件 ../../setup/setenv.sh,然后按照 Apigee 帐号信息的指示进行修改:您的用户名(与您的帐号关联的电子邮件地址)、您的组织名称,以及您用于进行 API 管理调用的网域。例如,对于 Edge Cloud,网域为 https://api.enterprise.apigee.com;但是,如果您使用的是 Edge Private Cloud,则您的网域可能会有所不同。
  3. 保存 setenv.sh 文件。
  4. 执行部署脚本:
    ./deploy.sh
    
  5. 如果部署成功,请执行调用脚本:
    ./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>