LoginSignup
0
0

Java・okhttp3ライブラリで簡単WebAPIアクセス・レスポンスデータはJavaオブジェクトに変換してみる

Last updated at Posted at 2024-05-12

開発現場において外部サービスが展開するAPIにアクセスし、何らかの情報を取得するというケースはよくあることだと思う。
okhttp3というライブラリを使用すると簡単にアクセスできるが、細かい記述方法を忘れてしまうため備忘録としてまとめておく。
なお、今回はLINEが公開しているWebAPIにアクセスする形式を例として紹介する。

okhttp3ライブラリを準備する

まずはアプリケーション上にライブラリをインストールする。
build.gradleファイル内部のdependencies内に以下の記述を追加しよう。

build.gradle
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;

    }

参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0