HTTP/2 Clientは、Java SE 9におけるIncubator Moduleとして実験的に導入されました。前回は、HTTP/2 Clientの基本的な使用法として、HTTPのGETメソッドを使用してリソースを取得するまでを解説しました。今月は、前回の続きとしてPOSTメソッドを使用してみましょう。

POSTメソッド

 POSTを使用する手順は、前回使用したGETとほぼ同じです。おおまかな手順は以下のようになります。

  1. HttpClientオブジェクトの生成
  2. HttpRequestオブジェクトを生成し、HTTPリクエストを作成
  3. HttpClientオブジェクトから、HTTPリクエストを送信
  4. 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例外の例外処理は省略してあります。