Java コールアウトを使用してレスポンスを大文字に変換する

Java Callout を初めて試す場合は、Java Callout の作成方法から始めることをおすすめします。

このクックブック サンプルでは、プロキシフローのコンテキストでカスタム Java コードを実行するシンプルな JavaCallout ポリシーを作成する方法を説明します。

サンプルコードの処理内容

このサンプルの 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 スクリプトを実行します。このスクリプトにより、必要な JAR 依存関係がローカルの Maven リポジトリにインストールされます。
  3. cd で java-cookbool/callout ディレクトリに移動します。
  4. Maven を実行します。
    mvn clean package
    
  5. 必要であれば、JAR ファイル edge-custom-policy-java-cookbook.jarjava-cookbook/apiproxy/resources/java にコピーされていることも確認してください。これは、プロキシでデプロイする JAR ファイルに必要な場所です。

javac でコンパイルする

javac でコードをコンパイルする場合は、java-cookbook ディレクトリから次の操作を行います。必要な JAR ファイルは、java-cookbook/lib ディレクトリに用意されています。

  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 スクリプトを実行します。
    ./deploy.sh
    
  5. デプロイが成功したら、invoke スクリプトを実行します。
    ./invoke.sh
    

    invoke スクリプトは、次のような cURL コマンドを呼び出します。

    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 ポリシーは次のとおりです。コールアウトが実行するクラスと JAR ファイルをポリシーが参照する方法に注意してください。すべての Java Callout ポリシーはこのパターンに従います。Java Callout ポリシーもご覧ください。

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