

# REST API 用に API Gateway で生成された Java SDK を使用する
<a name="how-to-call-apigateway-generated-java-sdk"></a>

このセクションでは、[単純な電卓](simple-calc-lambda-api-swagger-definition.md)の API を例として使用し、REST API に対して API Gateway で生成された Java SDK を使用するステップを示します。先に進む前に、「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」のステップを完了する必要があります。

**API Gateway で生成した Java SDK をインストールして使用するには**

1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。

1. [Apache Maven](https://maven.apache.org/) (バージョン 3.5 以降が必要です) をダウンロードしてインストールします。

1. [JDK 8](https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html) をダウンロードしてインストールします。

1. `JAVA_HOME` 環境変数を設定します。

1.  解凍した SDK フォルダ内の pom.xml ファイルに移動します。このフォルダーは、デフォルトでは `generated-code` です。**mvn install** コマンドを実行し、コンパイルされたアーティファクトファイルをローカルの Maven リポジトリにインストールします。これにより、コンパイル済み SDK ライブラリを含む `target` フォルダーが作成されます。

1.  空のディレクトリで次のコマンドを入力し、インストールした SDK ライブラリを使用して API を呼び出すためのクライアントプロジェクトスタブを作成します。

   ```
   mvn -B archetype:generate \
       -DarchetypeGroupdId=org.apache.maven.archetypes \
       -DgroupId=examples.aws.apig.simpleCalc.sdk.app \
       -DartifactId=SimpleCalc-sdkClient
   ```
**注記**  
 上のコマンドで区切り記号の `\` は読みやすくするために使用しています。コマンド全体は区切り記号がない単一の行となります。

    このコマンドでは、アプリケーションスタブを作成します。アプリケーションスタブには、プロジェクトのルートディレクトリ (上のコマンドの `pom.xml`SimpleCalc-sdkClient`src`) の * ファイルと * フォルダが含まれます。当初は、ソースファイルとして `src/main/java/{package-path}/App.java` と `src/test/java/{package-path}/AppTest.java` の 2 つがあります。この例では、*\$1package-path\$1* は `examples/aws/apig/simpleCalc/sdk/app` です。このパッケージパスは `DarchetypeGroupdId` の値から取得されます。`App.java` ファイルは、クライアントアプリケーションのテンプレートとして使用できます。また、必要に応じて同じフォルダーに他のファイルを追加できます。`AppTest.java` ファイルは、アプリケーションのユニットテストテンプレートとして使用できます。また、必要に応じて同じテストフォルダーに他のテストコードファイルを追加できます。

1. 生成された `pom.xml` ファイルのパッケージ依存関係を以下のように更新し、必要に応じてプロジェクトの `groupId`、`artifactId`、`version`、`name` の各プロパティを置き換えます。

   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>examples.aws.apig.simpleCalc.sdk.app</groupId>
     <artifactId>SimpleCalc-sdkClient</artifactId>
     <packaging>jar</packaging>
     <version>1.0-SNAPSHOT</version>
     <name>SimpleCalc-sdkClient</name>
     <url>http://maven.apache.org</url>
   
      <dependencies>
         <dependency>
             <groupId>com.amazonaws</groupId>
             <artifactId>aws-java-sdk-core</artifactId>
             <version>1.11.94</version>
         </dependency>
         <dependency>
             <groupId>my-apig-api-examples</groupId>
             <artifactId>simple-calc-sdk</artifactId>
             <version>1.0.0</version>
         </dependency>
         
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.12</version>
         <scope>test</scope>
       </dependency>
   
       <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.5</version>
       </dependency>    
     </dependencies>
   
     <build>
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.5.1</version>
           <configuration>
             <source>1.8</source>
             <target>1.8</target>
           </configuration>
         </plugin>
       </plugins>
     </build>
   </project>
   ```
**注記**  
 `aws-java-sdk-core` の依存アーティファクトの新しいバージョンが上記で指定されたバージョン (`1.11.94`) と互換性がない場合は、`<version>` タグを新しいバージョンに更新する必要があります。

1.  次に、SDK の `getABOp(GetABOpRequest req)`、`getApiRoot(GetApiRootRequest req)`、`postApiRoot(PostApiRootRequest req)` の各メソッドを呼び出して、SDK で API を呼び出す方法を示します。これらのメソッドは、`GET /{a}/{b}/{op}`、`GET /?a={x}&b={y}&op={operator}`、`POST /` の各メソッドに対応します。API リクエストのペイロードはそれぞれ `{"a": x, "b": y, "op": "operator"}` です。

    次のように `App.java` ファイルを更新します。

   ```
   package examples.aws.apig.simpleCalc.sdk.app;
   
   import java.io.IOException;
   
   import com.amazonaws.opensdk.config.ConnectionConfiguration;
   import com.amazonaws.opensdk.config.TimeoutConfiguration;
   
   import examples.aws.apig.simpleCalc.sdk.*;
   import examples.aws.apig.simpleCalc.sdk.model.*;
   import examples.aws.apig.simpleCalc.sdk.SimpleCalcSdk.*;
   
   public class App 
   {
       SimpleCalcSdk sdkClient;
   
       public App() {
           initSdk();
       }
   
       // The configuration settings are for illustration purposes and may not be a recommended best practice.
       private void initSdk() {
           sdkClient = SimpleCalcSdk.builder()
                 .connectionConfiguration(
                     new ConnectionConfiguration()
                           .maxConnections(100)
                           .connectionMaxIdleMillis(1000))
                 .timeoutConfiguration(
                     new TimeoutConfiguration()
                           .httpRequestTimeout(3000)
                           .totalExecutionTimeout(10000)
                           .socketTimeout(2000))
           .build();
   
       }
       // Calling shutdown is not necessary unless you want to exert explicit control of this resource.
       public void shutdown() {
           sdkClient.shutdown();
       }
        
       // GetABOpResult getABOp(GetABOpRequest getABOpRequest)
       public Output getResultWithPathParameters(String x, String y, String operator) {
       	operator = operator.equals("+") ? "add" : operator;
       	operator = operator.equals("/") ? "div" : operator; 
   
           GetABOpResult abopResult = sdkClient.getABOp(new GetABOpRequest().a(x).b(y).op(operator));
           return abopResult.getResult().getOutput();
       }
   
       public Output getResultWithQueryParameters(String a, String b, String op) {
           GetApiRootResult rootResult = sdkClient.getApiRoot(new GetApiRootRequest().a(a).b(b).op(op));
           return rootResult.getResult().getOutput();
       }
   
       public Output getResultByPostInputBody(Double x, Double y, String o) {
       	PostApiRootResult postResult = sdkClient.postApiRoot(
       		new PostApiRootRequest().input(new Input().a(x).b(y).op(o)));
       	return postResult.getResult().getOutput();
       }
   
       public static void main( String[] args )
       {
           System.out.println( "Simple calc" );
           // to begin
           App calc = new App();
           
           // call the SimpleCalc API
           Output res = calc.getResultWithPathParameters("1", "2", "-");
           System.out.printf("GET /1/2/-: %s\n", res.getC());
   
           // Use the type query parameter
           res = calc.getResultWithQueryParameters("1", "2", "+");
           System.out.printf("GET /?a=1&b=2&op=+: %s\n", res.getC());
   
           // Call POST with an Input body.
           res = calc.getResultByPostInputBody(1.0, 2.0, "*");
           System.out.printf("PUT /\n\n{\"a\":1, \"b\":2,\"op\":\"*\"}\n %s\n", res.getC());
   
           
       }
   }
   ```

    上の例で、SDK クライアントをインスタンス化するために使用している設定はサンプルであり、必ずしも推奨されるベストプラクティスではありません。また、`sdkClient.shutdown()` の呼び出しはオプションです。リソースを解放するタイミングを正確に制御する場合などに役立ちます。

 Java SDK を使用して API を呼び出すための基本的なパターンを示しました。必要に応じて手順を拡張し、他の API メソッドを呼び出すことができます。