Amazon API Gatewayのステージングまでは出来ている前提です。
SDKの生成とbuild
マネージメントコンソールのAPI Gatewayから、クライアントOS別にSDKの生成が出来ます。
ここでAndroid SDKを選択して「SDKの生成」ボタンを押すとソースコードとbuild用の設定ファイルが生成され、zip形式でダウンロードできます。
zipを展開して含まれているREADME.mdに大体の事は書いてあります。
- mavenを入れてください
- Java(JDK)を入れてください
- mvn installでjarを作ってください
- 出来上がったJarをプロジェクトフォルダ(クラスパスが通っているところ)にコピーしてください
上記に従い、出来上がったjarをAndroidの開発環境に入れます。
Android Studio 2.3だとプロジェクトフォルダーの./app/libs配下です。
又、SDKのbuild.gradleに記載されているにdependenciesをandroid Studioで作成したプロジェクトのbuild.gradleに追加しておいて下さい。
dependencies {
compile "com.amazonaws:aws-android-sdk-apigateway-core:2.3.1+"
}
SDKを利用してAPI Gatewayを呼び出す
buildが出来るようになったので、コードを書きます。
「SDKの生成」で生成されたXxxxxClient.java(XxxxxはAPI Gatewayのメソッド名)というinterfaceを利用します。
README.mdに使い方(というほどの内容でもない)が記載されています。
ApiClientFactory factory = new ApiClientFactory();
// create a client
final XxxxxClient client = factory.build(XxxxxClient.class);
これだけだと使い方がわかりませんがXxxxxClient.javaの中を見ると何となくわかります。
@com.amazonaws.mobileconnectors.apigateway.annotation.Service(endpoint = "https://XXXXXXXXX.execute-api.us-west-1.amazonaws.com/prod")
public interface XxxxxClient {
/**
* A generic invoker to invoke any API Gateway endpoint.
* @param request
* @return ApiResponse
*/
com.amazonaws.mobileconnectors.apigateway.ApiResponse execute(com.amazonaws.mobileconnectors.apigateway.ApiRequest request);
}
ApiRequest を引数に渡してexecuteを実行するとApiResponse が戻ります。
なので、このように書きました
XxxxxClient client = new ApiClientFactory().build(XxxxxClient.class);
ApiRequest request = new ApiRequest();
request.withHttpMethod(HttpMethodName.POST);
request.withPath(※methodName);
// bodyをJSON形式で作成
Map<String, String> m = new HashMap<String, String>();
m.put("arg", "123");
String json = (new Gson()).toJson(m);
request.withBody(json);
request.addHeader("Content-Length", Integer.toString(json.getBytes().length));
ApiResponse response = client.execute(request);
最初気付かなかったのですが、SDKのendpointにはステージのcontextまで(~/prod/)しか書かれていないので、メソッドはwithPathで設定します。※methodNameのところです。
これで動きました。
APIの認証については2種類+認証なしがありますが、今回は認証なしで動作確認しています。
※その他、Android側のお作法としてHTTP通信はmain threadで実行しない、マニフェストにインタネットアクセスの許可を設定する事に留意してください。