Java HttpClientクラス

HttpClientクラス

public static HttpClient new HttpClient()

HttpClientクラスはJava 11で追加された新しいHTTPクライアントで、次のような特徴があります。

  • HTTP/2をサポートします。
  • WebSocket通信(軽量な双方向通信)をサポートします。
  • 非同期メソッドを提供します。

HttpClientクラスの使用

以下では、指定されたURLからコンテンツを取得し、その内容を出力する例を通して、HttpClientによる通信を見ていきます。

HttpConnect.java

package com.devkuma.basic.http;

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

public class HttpConnect {
    public static void main(String[] args) throws InterruptedException {
        // 1. HttpClientを生成
        HttpClient cli = HttpClient.newBuilder()
                                   .version(HttpClient.Version.HTTP_2)
                                   .build();
        // 2. HttpRequestを生成
        HttpRequest request = HttpRequest.newBuilder()
                                         .uri(URI.create("https://www.devkuma.com/"))
                                         .build();
        // 3. Requestを送信
        cli.sendAsync(request, HttpResponse.BodyHandlers.ofString())
           // 4. Responseを受信
           .thenAccept(response -> {
               System.out.println(response.body());
           });

        Thread.sleep(3000);
    }
}

実行結果:

<!doctype html>
<html itemscope itemtype="http://schema.org/WebPage" lang="ko" class="no-js">
  <head>
    <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="generator" content="Hugo 0.101.0" />
<meta name="robots" content="index, follow">

...以下省略...

1. HttpClientオブジェクトの生成

HttpClientクラスはHTTP通信そのものを管理します。HttpClientオブジェクトを生成するには、builderメソッドでHttpClient.Builderオブジェクト(HttpClientを生成するためのビルダー)を生成し、そのsetterでHTTP通信の動作を設定します。

メソッド 設定内容
HttpClient.Builder authenticator(Authenticator auth) 認証コード(HTTP認証)
HttpClient.Builder connectTimeout(Duration duration) 接続タイムアウト時間
HttpClient.Builder cookieHandler(CookieHandler cookie) Cookieを操作するためのハンドラー
HttpClient.Builder followRedirects(HttpClient.Redirect policy) リダイレクトを自動的にたどるかどうかを指定
HttpClient.Builder priority(int priority) HTTP/2リクエスト優先順位
HttpClient.Builder version(HttpClient.Version version) HTTPバージョン

HttpClient.Builderインターフェースの主なsetterメソッド

最後にbuildメソッドを呼び出すことで、これまでの設定に基づいてHttpClientオブジェクトを生成できます。

2. HttpRequestオブジェクトの生成

HttpRequestクラスはHTTPリクエストを管理します。builderメソッドでビルダー(HttpRequest.Builder)を生成した後、setterでリクエスト情報を設定し、buildメソッドでHttpRequestオブジェクトを生成します。この流れはHttpClientの場合と同じです。

以下にHttpRequest.Builderクラスの主なsetterをまとめます。

メソッド 設定内容
HttpRequest.Builder DELETE() リクエストメソッド(DELETE)
HttpRequest.Builder GET() リクエストメソッド(GET)
HttpRequest.Builder POST(HttpRequest.BodyPublisher pub) リクエストメソッド(POST)
HttpRequest.Builder PUT(HttpRequest.BodyPublisher pub) リクエストメソッド(PUT)
HttpRequest.Builder method(String method, HttpRequest.BodyPublisher body) リクエストメソッドおよびリクエスト本文
HttpRequest.Builder setHeader(String name, String value) リクエストヘッダー
HttpRequest.Builder timeout(Duration duration) リクエストタイムアウト時間
HttpRequest.Builder uri(URI uri) リクエストURI

HttpRequest.Builderクラスの主なsetterメソッド

3. Requestの送信

HttpClientHttpRequestを生成した後は、sendAsyncメソッドでリクエストを送信します。

sendAsyncメソッド

public abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(
    HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
  T: レスポンス本文の型
  request: リクエスト情報
  responseBodyHandler: レスポンス本文のためのハンドラー

responseBodyHandler引数は、レスポンスを処理するハンドラーです。HttpResponse.BodyHandlersクラスの静的メソッドで生成できます。

メソッド レスポンスBodyの型
HttpResponse.BodyHandler<String> ofString([Charset charset]) 文字列
HttpResponse.BodyHandler<Stream<String>> ofLines() ストリーム
HttpResponse.BodyHandler<Path> ofFile(Path file [,OpenOption... openOptions]) ファイル
HttpResponse.BodyHandler<InputStream> ofInputStream() 入力ストリーム
HttpResponse.BodyHandler<byte[]> ofByteArray() バイト配列

HttpResponse.BodyHandlersクラスの主な静的メソッド

この例では、ofStringメソッドでレスポンス本文を文字列として取得します。

4. Responseの受信

sendAsyncメソッドによるリクエストの結果を処理するのは、thenAcceptメソッドの役割です。引数のラムダ式でHttpResponseオブジェクト(response)を受け取ります。ここでは、そのbodyメソッドで本文を返して出力しています。

以下にHttpResponseオブジェクトの主なメソッドをまとめます。

メソッド 戻り値
T body() 本文
HttpHeaders headers() レスポンスヘッダー
int statusCode() ステータスコード
URI uri() URI

HttpResponseクラスの主なGetter