HttpClientクラス
- public static HttpClient newHttpClient()
HttpClientクラスはJava 11で追加された新しいHTTPクライアントで、以下のような特徴を持っています。
・HTTP 2に対応
・WebSocket通信(=軽量な双方向通信)に対応
・非同期メソッドを提供
以下では、指定されたURLからコンテンツを取得し、その内容を標準出力に書き出す例を通じて、HttpClientによる通信のイディオムを見ていきます。
HttpConnect.java
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を生成
HttpClient cli = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.build();
// ②HttpRequestを生成
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("http:⁄⁄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クラスは、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メソッドでリクエストを送信するだけです。
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 |
▲HttpResponseクラスの主なゲッター






