モジュール java.net.http
パッケージ java.net.http

クラスHttpClient

java.lang.Object
java.net.http.HttpClient
すべての実装されたインタフェース:
AutoCloseable

public abstract class HttpClient extends Object implements AutoCloseable
HTTPクライアント。

HttpClientを使用して「リクエスト」を送信し、「レスポンス」を取得できます。 builderを介して HttpClientが作成されます。 newBuilderメソッドは、デフォルトのHttpClient実装のインスタンスを作成するビルダーを返します。 ビルダーを使用して、クライアントごとに次のような状態を構成できます: 優先プロトコル・バージョン(HTTP/1.1またはHTTP/2)、リダイレクトの有無、プロキシ、認証プロバイダなどがあります。一度ビルドされると、HttpClientは不変になり、複数のリクエストの送信に使用できます。

HttpClientは、すべてのリクエストの構成情報とリソース共有を提供します。 HttpClientインスタンスは、通常、独自の接続プールを管理します。その後、必要に応じて再利用できます。 通常、接続プールはHttpClientインスタンス間で共有されません。 可能なかぎり、操作ごとに新しいクライアントを作成すると、通常、そのような接続の再利用が防止されます。

HttpRequestが送信されるたびにBodyHandlerを指定する必要があります。 BodyHandlerは、レスポンス本文(存在する場合)の処理方法を決定します。 HttpResponseを受信すると、ヘッダー、レスポンス・コードおよび本文(typically)を使用できます。 レスポンス本文のバイトが読み取られたかどうかは、レスポンス本文のタイプ(T)によって決まります。

リクエストは同期または非同期のいずれかで送信できます。

  • send(HttpRequest, BodyHandler)ブロックは、リクエストが送信されてレスポンスが受信されるまでブロックされます。
  • sendAsync(HttpRequest, BodyHandler)がリクエストを送信し、レスポンスを非同期に受信します。 sendAsyncメソッドは、すぐにCompletableFuture<HttpResponse>を返します。 レスポンスが使用可能になると、 CompletableFutureが完了します。 返されたCompletableFutureは、様々な方法で結合して複数の非同期タスク間の依存性を宣言できます。

同期の例

HttpClient client = HttpClient.newBuilder()
     .version(Version.HTTP_1_1)
     .followRedirects(Redirect.NORMAL)
     .connectTimeout(Duration.ofSeconds(20))
     .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
     .authenticator(Authenticator.getDefault())
     .build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());

非同期の例

 HttpRequest request = HttpRequest.newBuilder()
     .uri(URI.create("https://foo.com/"))
     .timeout(Duration.ofMinutes(2))
     .header("Content-Type", "application/json")
     .POST(BodyPublishers.ofFile(Paths.get("file.json")))
     .build();
client.sendAsync(request, BodyHandlers.ofString())
     .thenApply(HttpResponse::body)
     .thenAccept(System.out::println);

セキュリティ・チェック

セキュリティ・マネージャが存在する場合は、HTTPクライアントの送信メソッドによってセキュリティ・チェックが実行されます。 宛先サーバーにアクセスするには適切なURLPermissionが必要で、プロキシ・サーバーが構成されている場合はプロキシ・サーバーにアクセスする必要があります。 プロキシにアクセスするために必要なURLPermissionの形式には、"CONNECT" (すべての種類のプロキシ処理)のmethodパラメータと、フォーム"socket://host:port"URL文字列があり、ホストとポートでプロキシ・アドレスを指定します。

APIのノート:
HttpClientによって割り当てられたリソースは、クライアント「閉じる」によって早期に再利用できます。
実装上のノート:

HttpClientのJDK組込み実装は、ベスト・エフォート実装を提供するために、close()shutdown()shutdownNow()awaitTermination(Duration)およびisTerminated()をオーバーライドします。 HttpResponse.BodyHandlers.ofInputStream()HttpResponse.BodyHandlers.ofLines()、またはHttpResponse.BodyHandlers.ofPublisher()を使用するときに提供されるストリームなど、返されたストリームを閉じる、取り消す、または読み取ることができないと、「正常停止」を実行する前に送信されたリクエストが完了するまで実行できないことがあります。 同様に、カスタムBodySubscriberから「リクエスト・データ」または「サブスクリプションを解約」に失敗すると、データおよび「正常な停止を停止」の配信が停止する可能性があります。

executorHttpClientに明示的に設定されておらず、セキュリティ・マネージャがインストールされている場合、デフォルト・エグゼキュータは権限が付与されていないコンテキストで非同期タスクおよび依存タスクを実行します。 カスタムの「本文パブリッシャをリクエスト」「レスポンス本文ハンドラ」「レスポンス本文サブスクライバ」および「WebSocketリスナー」は、権限が必要な操作を実行する場合は、適切な「特権的なコンテキスト」内で実行する必要があります。

導入されたバージョン:
11