開発現場において外部サービスが展開するAPIにアクセスし、何らかの情報を取得するというケースはよくあることだと思う。
okhttp3というライブラリを使用すると簡単にアクセスできるが、細かい記述方法を忘れてしまうため備忘録としてまとめておく。
なお、今回はLINEが公開しているWebAPIにアクセスする形式を例として紹介する。
okhttp3ライブラリを準備する
まずはアプリケーション上にライブラリ用意する。
build.gradleファイル内部のdependencies内に以下の記述を追加しよう。
dependencies {
...
...
implementation 'com.squareup.okhttp3:okhttp:4.9.2'
}
使用しているIDEがintelliJの場合はファイル右上に象さんの更新アイコンが表示されるはず。
クリックしてしばらくするとライブラリのインストールが完了するはず。
WebAPIアクセス時に必要な情報を確認する
WebAPIにアクセスする際は、特定の情報を添付してアクセスする事を求められるケースが多い。例として、LINEのWebAPIアクセスには、以下のような情報が必要となっていた。
アクセスするURL
GET https://api.line.me/v2/bot/channel/webhook/endpoint
必要な設定情報(ヘッダー情報)
上のURLにアクセスする際、必要となる情報は以下のとおり。
curl -X GET \
-H 'Authorization: Bearer {CHANNEL_ACCESS_TOKEN}' \
-H 'Content-Type:application/json' \
https://api.line.me/v2/bot/channel/webhook/endpoint
上はカールコマンドでWebAPIを叩く例だが、ざっくり言うと
・ヘッダー情報に特定のトークン(LINEのパスワードのようなもの。ここでは詳しく説明しない)の値を設定してアクセスすること
・ヘッダー情報にコンテンツタイプの情報をjson指定してアクセスすること
上記2点を設定した状態で上のURLにアクセスしてね、という意味。
得られるレスポンス情報の例
上のAPIにアクセスすると、以下のようなレスポンス例が返却される.
{
"endpoint": "https://example.com/test",
"active": true
}
これらの点を踏まえた上、okhttp3を利用してAPIにアクセスする場のプログラムは以下のようになる。
public void WebApiGetAccess() {
// APIのリクエストに必要な情報を生成する
// `header()`メソッドを使用して必要な情報をヘッダーに追加することができる
// HTTPメソッドのGETを指定する場合は `get()`メソッドを使用するだけ
Request request = new Request.Builder()
.header("Authorization", "Bearer " + "LINEのトークン値")
.header("Content-Type", "application/json")
.get()
.url(httpUrl)
.build();
// アクセス処理を行うために必要なCallオブジェクトを生成する
// 上で生成したrequestオブジェクトは最終行で引数に設定する
Call call = new OkHttpClient.Builder()
.build()
.newCall(request);
try {
// callオブジェクトに対して`execute()`メソッドで対象のWebAPIにアクセスする.
Response response = call.execute();
// レスポンスデータをJavaオブジェクトに変換するために必要なObjectMapperをインスタンス化する.
ObjectMapper mapper = new ObjectMapper();
// mapperインスタンスの `readValue()`メソッドを利用してJavaオブジェクトに変換する.
// `radValue()`メソッドの第2引数に変換したいクラスの名前を指定する.
ResponseToJavaObject responseToJavaObject = mapper.readValue(response.body().string(), ResponseToJavaObject.class);
// 各フィールドに対してgetterを使用することでレスポンスデータを出力することができる
System.out.println(responseToJavaObject.getEndpoint());
System.out.println(responseToJavaObject.getActive());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 返却されるレスポンスデータをJavaオブジェクトに変換するためのクラス
* インスタンス化しなくても利用できるように`static`を付与しておく
* 返却されるデータに応じた名前を持つフィールドを用意しておくこと
*/
@Data
public static class responseToJavaObject {
private String endpoint;
private String active;
}
参考になれば幸いです。