java.net.http.HttpClient
同期リクエストを送信します。
「java.net.http.HttpClient」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
最新のHTTPクライアント
Java 11以降、JDKにはjava.net.httpパッケージの最新のHTTPクライアントが付属しています。古いHttpURLConnectionに代わる、HTTP/1.1とHTTP/2をサポートした、すっきりとした流れるようなAPIです。
中心となる3つの型は次のとおりです。
- HttpClient — リクエストを送信し、設定(タイムアウト、プロキシ、リダイレクト)を管理します。
- HttpRequest — 送信する内容を不変に記述します。
- HttpResponse — ステータス、ヘッダー、ボディを含む結果です。
HttpClientの作成
静的なnewBuilder()メソッドを使ってクライアントを構築します。1つのクライアントを複数のリクエストで再利用でき、スレッドセーフです。
ここではHTTP/2と接続タイムアウトを設定しています。手早くデフォルトインスタンスを作成するには、newHttpClient()も使用できます。
import java.net.http.HttpClient;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10))
.build();
System.out.println("Client version: " + client.version());
}
}リクエストの構築
HttpRequest は不変であり、fluent builderを使って構築します。最低限、URIを指定します。デフォルトではGETを実行します。
文字列をURIに変換するには、URI.create(...) を使います。
import java.net.URI;
import java.net.http.HttpRequest;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com/data"))
.GET()
.build();
System.out.println("Method: " + request.method());
System.out.println("URI: " + request.uri());
}
}同期的な送信
send メソッドは、レスポンスが到着するまで呼び出し元のスレッドをブロックします。レスポンスボディの解釈方法をクライアントに伝える BodyHandler が必要です。
BodyHandlers.ofString() はボディを String に読み込みます。
import java.net.URI;
import java.net.http.*;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
}
}ステータスコードの読み取り
レスポンスでは、statusCode() によって int 型のステータスコードを取得できます。2xxのコードは成功、3xxはリダイレクト、4xxはクライアントエラー、5xxはサーバーエラーを意味します。
注意: HTTPクライアントは4xx/5xxのレスポンスで例外をスローしません。コードを自分で確認する必要があります。
public class Main {
public static void main(String[] args) {
int status = 404;
String label;
if (status >= 200 && status < 300) label = "Success";
else if (status >= 300 && status < 400) label = "Redirect";
else if (status >= 400 && status < 500) label = "Client error";
else label = "Server error";
System.out.println(status + " -> " + label);
}
}ボディの読み取り
BodyHandlers.ofString() を使うと、response.body() は String を返します。バイト、ファイル、ストリーム用のハンドラーもあります(後で説明します)。
このスニペットは、受信するボディの内容をシミュレートしています。
public class Main {
public static void main(String[] args) {
String body = "{\"message\":\"hello\"}";
System.out.println("Body length: " + body.length());
System.out.println("Body: " + body);
}
}リダイレクトの処理
デフォルトでは、クライアントはリダイレクトに従いません。ビルダーで followRedirects(...) を設定します。
HttpClient.Redirect のオプションは NEVER、ALWAYS、NORMAL です。NORMAL は、HTTPSからHTTPへのダウングレードを除き、リダイレクトに従います。
import java.net.http.HttpClient;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
System.out.println("Redirect policy: " + client.followRedirects());
}
}リクエストごとのタイムアウト
接続タイムアウトはクライアントに設定します。レスポンスを待つ時間を指定するリクエストタイムアウトは、timeout(...) を使ってリクエストに設定します。
タイムアウトになると、send は HttpTimeoutException をスローします。
import java.net.URI;
import java.net.http.HttpRequest;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.timeout(Duration.ofSeconds(5))
.build();
System.out.println("Timeout set: " + request.timeout().isPresent());
}
}レスポンスヘッダーの確認
レスポンスには HttpHeaders オブジェクトが含まれており、headers() からアクセスできます。ヘッダーの検索では大文字と小文字が区別されず、複数の値が返される場合もあるため、firstValue(...) は Optional<String> を返します。
import java.util.Optional;
public class Main {
public static void main(String[] args) {
// Simulating a header lookup result
Optional<String> contentType = Optional.of("application/json");
System.out.println("Content-Type: " + contentType.orElse("unknown"));
}
}検査例外
同期的な send は、次の2つの検査例外を宣言します。
- IOException — ネットワークまたはプロトコルの失敗です。
- InterruptedException — ブロック中のスレッドが割り込まれました。
両方とも捕捉するか、宣言する必要があります。非同期呼び出し(次のレッスン)では、futureを返すことでこの処理を避けられます。
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
// client.send(...) would go here
throw new IOException("connection refused");
} catch (IOException e) {
System.out.println("Network problem: " + e.getMessage());
}
}
}再利用可能なクライアント
ベストプラクティスは、1つの HttpClient を作成し、アプリケーション全体で再利用することです。接続をプールでき、完全にスレッドセーフです。
リクエストごとに新しいクライアントを作成するとリソースを無駄にし、HTTP/2の多重化も活用できません。
import java.net.http.HttpClient;
public class Main {
private static final HttpClient SHARED = HttpClient.newHttpClient();
public static void main(String[] args) {
System.out.println("Shared client ready: " + (SHARED != null));
}
}理解度チェック
同期HTTPクライアントについての理解度を確認しましょう。
まとめ
JDK HTTPクライアントの基本を学びました。
- HttpClient.newBuilder() では、バージョン、タイムアウト、リダイレクトを設定します。インスタンスは1つを再利用します。
- HttpRequest.newBuilder().uri(...).GET() で不変のリクエストを構築します。
- client.send(request, BodyHandlers.ofString()) はブロックし、
HttpResponse<String>を返します。 statusCode()、body()、headers()で結果を読み取ります。- 2xx以外のコードでは例外はスローされないため、自分で確認します。
よくある質問
「java.net.http.HttpClient」レッスンは無料ですか?
はい。「java.net.http.HttpClient」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「java.net.http.HttpClient」で何を学びますか?
同期リクエストを送信します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「java.net.http.HttpClient」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- java.net.http.HttpClient
- 非同期リクエスト
- リクエストボディとヘッダー
- レスポンスの処理