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の送信
HttpClientとHttpRequestを生成した後は、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