WebAPI連携の第一歩!HTTPクライアントAPIを使いこなそう

docs

WebAPIを使えば、天気予報を取得したり、お店の情報を検索したりと、いろんなことができるようになるんだ。

でも、「WebAPIを使うって言っても、具体的にどうすればいいの?」って思った人もいるんじゃないかな? そこで今回は、JavaでWebAPIにアクセスするための「HTTPクライアントAPI」について、みっちり解説していくよ!

HTTPクライアントAPIってなに?

WebAPIは、インターネットを通じてデータをやり取りする仕組みだって話は前回したよね。このデータ交換の裏側では、**HTTP(Hypertext Transfer Protocol)**というルールが使われているんだ。Webサイトを見るときにブラウザが使っているのと同じ仕組みだよ。

HTTPクライアントAPIは、その名の通り、JavaのプログラムからこのHTTP通信を行うための機能を提供してくれるものなんだ。これを使えば、WebAPIのURLにリクエストを送って、返ってきたデータを受け取るといった操作ができるようになるんだよ。

Javaには、昔からHTTP通信を行うためのAPIがいくつかあったんだけど、Java 11で新しく「HttpClient」というAPIが登場したんだ。これがめちゃくちゃ使いやすくて、今からHTTP通信を学ぶなら、まずはこれを使うのがおすすめだよ。

HttpClientを使ってみよう!

じゃあ、早速HttpClientを使って簡単なリクエストを送ってみよう。今回は、架空の天気予報APIを例にするね。

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class WeatherApiClient {
    public static void main(String[] args) {
        // HttpClientのインスタンスを作成
        HttpClient client = HttpClient.newHttpClient();

        // リクエストを作成
        // 今回は東京の天気予報を取得するURIを仮定
        URI uri = URI.create("https://example.com/api/weather?city=tokyo");
        HttpRequest request = HttpRequest.newBuilder()
                                    .uri(uri)
                                    .GET() // GETメソッドでリクエストを送る
                                    .build();

        try {
            // リクエストを送信してレスポンスを受け取る
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // レスポンスのステータスコードを表示
            System.out.println("ステータスコード: " + response.statusCode());

            // レスポンスボディ(取得したデータ)を表示
            System.out.println("天気予報データ:\n" + response.body());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

このコードのポイントを見ていこう。

  • HttpClient client = HttpClient.newHttpClient();: まず、HttpClientのインスタンスを作るよ。これはHTTP通信を行うための窓口みたいなものだね。
  • URI uri = URI.create("https://example.com/api/weather?city=tokyo");: アクセスしたいWebAPIのURLをURIオブジェクトとして作成するよ。今回は例としてhttps://example.com/api/weather?city=tokyoというURLを使っているけど、実際にはWebAPIの提供元が公開しているURLを使うことになるよ。URLの最後に?city=tokyoとあるのは、東京の天気予報を取得するためのパラメーターだね。
  • HttpRequest request = HttpRequest.newBuilder().uri(uri).GET().build();: 次に、実際に送るリクエストを作成するよ。HttpRequest.newBuilder()でリクエストの組み立てを開始して、uri()でアクセス先を指定。GET()は、HTTPメソッドの一つで、データを取得するときによく使われるんだ。他にも、データを送信するときに使うPOSTなんかのメソッドがあるよ。
  • HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());: 作成したリクエストをclient.send()メソッドで送信するよ。HttpResponse.BodyHandlers.ofString()は、WebAPIから返ってくるレスポンスボディを文字列として受け取るための設定だよ。
  • response.statusCode(): WebAPIからのレスポンスには、通信が成功したか失敗したかを示すステータスコードが含まれているんだ。例えば、200 OKなら成功、404 Not Foundならリソースが見つからなかった、といった意味になるよ。
  • response.body(): これが、WebAPIから実際に送られてきたデータだよ。天気予報APIなら、今日の天気や気温なんかの情報がここに入っているはずだね。

このプログラムを実行すると、WebAPIにリクエストが送られて、天気予報のデータがコンソールに表示されるはずだよ。

いろいろなHTTPメソッドを使ってみよう

さっきはGETメソッドを使ったけど、HTTPには他にもいくつかのメソッドがあるんだ。WebAPIを使う上で特によく使うのは、以下の3つかな。

  • GET: データの取得
  • POST: データの新規作成・送信
  • PUT: データの更新
  • DELETE: データの削除

それぞれのメソッドの使い方の例を見てみよう。

POSTメソッドでデータを送信する

新しくToDoリストのタスクを追加するAPIを想定してみよう。

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class TodoApiClient {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();

        // 送信するデータ(JSON形式)
        String jsonBody = "{\"title\": \"牛乳を買う\", \"completed\": false}";

        HttpRequest request = HttpRequest.newBuilder()
                                    .uri(URI.create("https://example.com/api/todos"))
                                    .header("Content-Type", "application/json") // 送信するデータの形式を指定
                                    .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // POSTメソッドでJSONデータを送信
                                    .build();

        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("ステータスコード: " + response.statusCode());
            System.out.println("レスポンス:\n" + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ポイントは次の通りだよ。

  • String jsonBody = "{\"title\": \"牛乳を買う\", \"completed\": false}";: POSTメソッドでデータを送るときは、通常、JSON形式の文字列を使うことが多いよ。今回は「牛乳を買う」というタスクを追加するイメージだね。
  • .header("Content-Type", "application/json"): WebAPIに「今からJSON形式のデータを送りますよ」と伝えるために、Content-Typeというヘッダーを設定しているよ。これはとっても大事な設定なんだ。
  • .POST(HttpRequest.BodyPublishers.ofString(jsonBody)): POST()メソッドの引数に、送信したいデータをHttpRequest.BodyPublishers.ofString()で渡しているね。

PUTメソッドでデータを更新する

今度は、既存のToDoタスクを完了済みに更新するAPIを想定してみよう。

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class TodoUpdateClient {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();

        // 更新するデータ(JSON形式)
        String jsonBody = "{\"title\": \"牛乳を買う\", \"completed\": true}"; // completedをtrueに

        // 更新したいタスクのIDをURLに含める
        HttpRequest request = HttpRequest.newBuilder()
                                    .uri(URI.create("https://example.com/api/todos/123")) // IDが123のタスクを更新
                                    .header("Content-Type", "application/json")
                                    .PUT(HttpRequest.BodyPublishers.ofString(jsonBody)) // PUTメソッドでJSONデータを送信
                                    .build();

        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("ステータスコード: " + response.statusCode());
            System.out.println("レスポンス:\n" + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

PUTメソッドもPOSTメソッドと似ていて、更新したいデータをJSONなどで送信するよ。URLに更新したいリソースのIDを含めるのが一般的だね。

DELETEメソッドでデータを削除する

最後に、ToDoタスクを削除するAPIを想定してみよう。

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class TodoDeleteClient {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();

        // 削除したいタスクのIDをURLに含める
        HttpRequest request = HttpRequest.newBuilder()
                                    .uri(URI.create("https://example.com/api/todos/123")) // IDが123のタスクを削除
                                    .DELETE() // DELETEメソッドでリクエストを送る
                                    .build();

        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("ステータスコード: " + response.statusCode());
            System.out.println("レスポンス:\n" + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

DELETEメソッドは、データを削除するだけなので、通常はボディにデータを設定する必要はないよ。URLに削除したいリソースのIDを含めるのが一般的だね。

非同期処理でWebAPIを呼び出す

これまでの例では、client.send()メソッドを使って同期的に(リクエストが完了するまで次の処理に進まない)WebAPIを呼び出していたけど、HttpClientは非同期処理にも対応しているんだ。

非同期処理とは、WebAPIへのリクエストを送信した後、レスポンスを待つ間に別の処理を進められる仕組みのこと。これによって、プログラム全体の応答性を高めることができるんだ。特に、WebAPIの応答に時間がかかるときなんかに効果的だよ。

HttpClientで非同期処理を行うには、sendAsync()メソッドを使うんだ。

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture; // 非同期処理で使う

public class AsyncApiClient {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder()
                                    .uri(URI.create("https://example.com/api/slow_service")) // 時間がかかるAPIを想定
                                    .GET()
                                    .build();

        // 非同期でリクエストを送信
        CompletableFuture<HttpResponse<String>> futureResponse =
            client.sendAsync(request, HttpResponse.BodyHandlers.ofString());

        System.out.println("リクエストを送信しました。他の処理を進められます。");

        // 非同期処理の結果を受け取る(処理が完了するまで待機)
        futureResponse.thenAccept(response -> {
            System.out.println("非同期レスポンス ステータスコード: " + response.statusCode());
            System.out.println("非同期レスポンス ボディ:\n" + response.body());
        }).exceptionally(e -> { // エラーハンドリング
            System.err.println("エラーが発生しました: " + e.getMessage());
            return null;
        });

        // 非同期処理の完了を待たずに、別の処理を実行できる
        System.out.println("こちらは非同期処理と並行して実行される処理です。");

        // メインスレッドが終了しないように少し待つ(実際のアプリケーションでは必要に応じて適切に制御する)
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • client.sendAsync(): このメソッドを使うと、CompletableFutureというオブジェクトが返ってくるよ。これは「将来的に結果が返ってくるよ」という約束を表すものなんだ。
  • .thenAccept(response -> { ... }): CompletableFuturethenAccept()メソッドを使うと、非同期処理が完了したときに実行する処理を指定できるんだ。ここでは、レスポンスが返ってきたときにステータスコードとボディを表示する処理を書いているね。
  • .exceptionally(e -> { ... }): もし非同期処理中にエラーが発生した場合は、exceptionally()メソッドでエラーハンドリングができるよ。

非同期処理はちょっと難しいかもしれないけど、大きなアプリケーションを作る上ではとても重要な技術だから、少しずつ慣れていこう!


まとめ

今回はJavaでWebAPIと連携するための「HTTPクライアントAPI」について解説したよ。

  • Java 11から登場したHttpClientがシンプルで使いやすい!
  • GETでデータを取得、POSTでデータを送信、PUTでデータを更新、DELETEでデータを削除できる。
  • 非同期処理を使えば、WebAPIの応答を待つ間に別の処理を進められる!

これで、JavaプログラムからWebAPIを呼び出すための基本的な知識はバッチリだね! 次回は、WebAPIから返ってきたJSONデータをJavaのオブジェクトに変換する方法について解説する予定だよ。せっかくデータが取得できても、そのままの文字列じゃ扱いにくいからね。

今回の内容で分からないことがあったら、いつでも質問してね!


前回の記事はこちら: JavaDocでコードを賢く整理しよう | ToolDocs

コメント

タイトルとURLをコピーしました