Java Callout を初めて試す場合は、Java Callout の作成方法から始めることをおすすめします。
このクックブック サンプルでは、プロキシフローのコンテキストでカスタム Java コードを実行するシンプルな JavaCallout ポリシーを作成する方法を説明します。
サンプルコードの処理内容
このサンプルの API プロキシは、単純な JSON レスポンスを返すターゲット サービスを呼び出します。Java Callout ポリシーは、ターゲット レスポンス フローに配置されます。Java コードは、レスポンスのヘッダーと内容を大文字に変換します。簡単な例ですが、Edge 上の API プロキシのコンテキストでカスタム Java コードを動作させる方法を示しています。
サンプルを試す
プロジェクトをダウンロードする
このプロジェクトは、GitHub の Apigee api-platform-samples リポジトリからダウンロードできます。
- システムに api-platform-samples をダウンロードするか、クローンを作成します。
- ターミナルまたは任意のコードエディタで
api-platform-samples/doc-samples/java-cookbook
プロジェクトに移動します。
Maven でコードをコンパイルする
このプロジェクトは Maven でコンパイルできるように設定されています。javac
を使用する方法については、Maven の例の後に説明します。
- Maven がインストールされていることを確認します。
mvn -version
java-cookbook/buildsetup.sh
スクリプトを実行します。このスクリプトにより、必要な JAR 依存関係がローカルの Maven リポジトリにインストールされます。- cd で
java-cookbool/callout
ディレクトリに移動します。 - Maven を実行します。
mvn clean package
- 必要であれば、JAR ファイル
edge-custom-policy-java-cookbook.jar
がjava-cookbook/apiproxy/resources/java
にコピーされていることも確認してください。これは、プロキシでデプロイする JAR ファイルに必要な場所です。
javac でコンパイルする
javac
でコードをコンパイルする場合は、java-cookbook
ディレクトリから次の操作を行います。必要な JAR ファイルは、java-cookbook/lib
ディレクトリに用意されています。
- cd で
api-platform-samples/doc-samples/java-cookbook
に移動します。 - javac がパスに含まれていることを確認します。
javac -version
- 次の javac コマンドを実行します。
javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/ResponseUppercase.java
- JAR ファイルを apiproxy/resources/java ディレクトリにコピーします。これは、プロキシでデプロイする JAR ファイル用に必要な場所です。
cp com/apigeesample/ResponseUppercase.class apiproxy/resources/java
プロキシをデプロイして呼び出す
デプロイ スクリプトは ./java-cookbook
ディレクトリにあります。ただし、スクリプトを実行する前に、クイック設定を行う必要があります。
- cd で
api-platform-samples/doc-samples/java-cookbook
に移動します。 ../../setup/setenv.sh
ファイルをまだ編集していない場合は、このファイルを開いて、Apigee アカウント情報に合わせてユーザー名(アカウントに関連付けられたメールアドレス)、組織名、API 管理呼び出しを行うために使用するドメインを編集します。たとえば、Edge Cloud の場合、ドメインはhttps://api.enterprise.apigee.com
ですが、Edge Private Cloud を使用している場合はドメインが異なる可能性があります。setenv.sh
ファイルを保存します。- deploy スクリプトを実行します。
./deploy.sh
- デプロイが成功したら、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>