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

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

如果您是第一次尝试使用 Java callout,我们建议您先阅读如何创建 Java callout

此实用指南示例演示了如何创建简单的 JavaCallout 政策,以在代理流的上下文中执行自定义 Java 代码。

示例代码有何用途?

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

试用示例

下载项目

为了简化操作,您可以从 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 云,网域为 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 callout 的指南,请参阅如何创建 Java callout

java-cookbook

    apiproxy
        java-cookbook.xml
    policies
        responseUppercase.xml
    proxies
        default.xml
    resources
        java
            ResponseUppercase.jar
    targets
        default.xml

关于 Java 代码

Java Callout 政策会运行以下 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 Callout 政策。 请注意,它如何引用 callout 执行的类和 JAR 文件。所有 Java Callout 政策都遵循此模式。另请参阅 JavaCallout 政策

<JavaCallout name="responseUppercase">         
    <ClassName>com.apigeesample.ResponseUppercase</ClassName>         
    <ResourceURL>java://ResponseUppercase.jar</ResourceURL> 
</JavaCallout>