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

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

如果您是第一次试用 Java 调用程序,建议您先查看如何创建 Java 标注

此实战宝典示例演示了如何创建可执行的简单 JavaCallout 政策 自定义 Java 代码。

示例代码有何用途?

此示例中的 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 云,域名为 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"}

代理流

这是跟踪工具的屏幕截图,显示了代理的流程:

代理结构

这是代理的结构。请注意,它包含 JAR 文件, apiproxy/resources/java 目录中。必须提供 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>