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

Java コールアウトを初めて試す場合は、Java コールアウトの作成方法から始めることをおすすめします。

このクックブック サンプルでは、プロキシフローのコンテキスト内でカスタム 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
        

プロキシのデプロイと呼び出し

deploy スクリプトは ./java-cookbook ディレクトリにあります。ただし、スクリプトを実行する前に、クイック設定を行う必要があります。

  1. cd で api-platform-samples/doc-samples/java-cookbook に移動します。
  2. ../../setup/setenv.sh をまだ編集していない場合はこのファイルを開いて、ユーザー名(アカウントに関連付けられたメールアドレス)、組織名、API 管理呼び出しを行うために使用するドメインを、Apigee アカウント情報に従って編集します。たとえば、Edge クラウドの場合、ドメインは 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 コールアウトをコンパイルしてデプロイする方法については、Java コールアウトの作成方法をご覧ください。

    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>