HTTP/2 Clientは、Java SE 9におけるIncubator Moduleとして実験的に導入されました。前回は、HTTP/2 Clientの基本的な使用法として、HTTPのGETメソッドを使用してリソースを取得するまでを解説しました。今月は、前回の続きとしてPOSTメソッドを使用してみましょう。
POSTメソッド
POSTを使用する手順は、前回使用したGETとほぼ同じです。おおまかな手順は以下のようになります。
- HttpClientオブジェクトの生成
- HttpRequestオブジェクトを生成し、HTTPリクエストを作成
- HttpClientオブジェクトから、HTTPリクエストを送信
- HttpResponseオブジェクトを使用して、HTTPレスポンスを処理
GETとの違いは、(2)のHTTPリクエストの作成部分です。
POSTとGETの使用上の違いの1つにボディの送信があります。POSTではボディを送信できますが、まずはボディを送信せずに試してみましょう(リスト1)。
リスト1●POSTの使用例
// 1. HttpClientオブジェクトの生成
HttpClient client = HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.ALWAYS)
.build();
// 2. HTTPリクエストの作成
HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:8084/demo"))
.POST(HttpRequest.noBody())
.build();
// 3. HTTPリクエストの送信
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandler.asString()
);
// 4. HTTPレスポンスの処理は省略
HttpClientオブジェクトの生成はGETの場合と同じです。ここでは、前回紹介したようにリダイレクトを行うように指定してあります。また、HTTPリクエストの送信およびHTTPレスポンスの処理もGETの場合と同じです。
唯一異なるのが、HTTPリクエストの作成部分です。HttpRequestクラスのnewBuilderメソッドでHttpRequest.Builderオブジェクトを生成します。引数はURIです。ここでは、テスト用にローカルの8084ポートでWebサーバーを起動しています。
POSTを使用する場合、赤字で示したようにPOSTメソッドを使用します。GETメソッドは引数がありませんでしたが、POSTメソッドはHttpRequest.BodyProcessorインタフェースの引数をとります。POSTでボディを送信する場合、この引数で指定します。しかし、ここではボディを送信しないため、HttpRequestクラスのnoBodyメソッドを使用します(青字部分)。
最後に、buildメソッドでHttpRequestオブジェクトを生成するのも、GETの場合と同じです。なお、sendメソッドでのjava.io.IOException例外の例外処理は省略してあります。