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クラスの主なゲッター