public static HttpClient newHttpClient()
HttpClientクラスはJava 11で追加された新しいHTTPクライアントで、以下のような特徴を持っています。
- HTTP 2に対応
- WebSocket通信(=軽量な双方向通信)に対応
- 非同期メソッドを提供
以下では、指定されたURLからコンテンツを取得し、その内容を標準出力に書き出す例を通じて、HttpClientによる通信のイディオムを見ていきます。
- package com.example.mynavi.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 {
- // ①HttpClientを生成
- var cli = HttpClient.newBuilder()
- .version(HttpClient.Version.HTTP_2)
- .build();
- // ②HttpRequestを生成
- var req = HttpRequest.newBuilder()
- .uri(URI.create("
https://java-code.jp/")) - .build();
- // ③リクエストを送信
- cli.sendAsync(req, HttpResponse.BodyHandlers.ofString())
- .thenAccept(res -> {
- System.out.println(res.body());
- });
- Thread.sleep(3000);
- }
- }
▼
- <!DOCTYPE html>
- <html lang="ja">
- <head>
- <meta charset="utf-8">
- <title>Javaコード入門</title>
- ...後略...
①HttpClientオブジェクトを生成する
HttpClientクラスは、HTTP通信そのものを管理します。HttpClientオブジェクトを生成するには、builderメソッドでHttpClient.Builderオブジェクト(=HttpClientを生成するためのビルダー)を生成した後、そのセッターでHTTP通信の挙動を設定します。
| メソッド | 設定内容 |
|---|---|
| HttpClient.Builder authenticator(Authenticator auth) | 認証コード(HTTP認証) |
| HttpClient.Builder connectTimeout(Duration duration) | 接続タイムアウト時間 |
| HttpClient.Builder cookieHandler(CookieHandler cookie) | クッキーを操作するためのハンドラー |
| HttpClient.Builder followRedirects(HttpClient.Redirect policy) | リダイレクト指定に従うか |
| HttpClient.Builder priority(int priority) | HTTP/2リクエストの優先度 |
| HttpClient.Builder version(HttpClient.Version version) | HTTPのバージョン |
▲HttpClient.Builderインターフェイスの主なセッター
最後にbuildメソッドを呼び出すことで、それまでの設定に基づいてHttpClientオブジェクトを生成できます。
②HttpRequestオブジェクトを生成する
HttpRequestクラスは、HTTPリクエストを管理します。builderメソッドでビルダー(HttpRequest.Builder)を生成した後、セッターでリクエスト情報を設定、buildメソッドでHttpRequestオブジェクトを生成する、という流れは、HttpClientの場合と同じです。
以下に、HttpRequest.Builderクラスの主なセッターをまとめます。
| メソッド | 設定内容 |
|---|---|
| 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クラスの主なセッターメソッド
③リクエストを送信する
HttpClient/HttpRequestを生成できたら、あとはsendAsyncメソッドでリクエストを送信するだけです。
public abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(
HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
T:レスポンス本文の型
request:リクエスト情報
responseBodyHandler:レスポンス本体のためのハンドラー
引数responseBodyHandlerは、レスポンスを処理するためのハンドラーです。
HttpResponse.BodyHandlersクラスの静的メソッドによって生成できます。
| メソッド | レスポンス本体の型 |
|---|---|
| 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メソッドなので、レスポンス本文を文字列として取得します。
sendAsyncメソッドによるリクエストの結果を処理するのは、thenAcceptメソッドの役割です。引数のラムダ式は、HttpResponseオブジェクト(res)を受け取ります。ここでは、そのbodyメソッドで本文を取得&出力しています。
以下に、HttpResponseオブジェクトの主なメソッドをまとめます。
| メソッド | 取得内容 |
|---|---|
| T body() | 本文 |
| HttpHeaders headers() | 応答ヘッダー |
| int statusCode() | ステータスコード |
| URI uri() | URI |
監修