1. 概要

このチュートリアルでは、HttpURLConnectionを使用してJSONPOSTリクエストを作成する方法を示します。

2. HttpURLConnectionを使用したJSONPOSTリクエストの作成

2.1. URLオブジェクトを作成します

HTTPPOSTメソッドを介してJSONデータを受け入れるターゲットURI文字列を使用してURLオブジェクトを作成しましょう。

URL url = new URL ("https://reqres.in/api/users");

2.2. 接続を開く

上記のURLオブジェクトから、 openConnection メソッドを呼び出して、HttpURLConnectionオブジェクトを取得できます。

HttpURLConnection は抽象クラスであるため、直接インスタンス化することはできません。

HttpURLConnection con = (HttpURLConnection)url.openConnection();

2.3. リクエスト方法を設定する

POSTリクエストを送信するには、リクエストメソッドのプロパティをPOSTに設定する必要があります。

con.setRequestMethod("POST");

2.4. リクエストコンテンツタイプヘッダーパラメータを設定します

「content-type」リクエストヘッダーを「application/json」に設定して、リクエストコンテンツをJSON形式で送信します。 リクエスト本文をJSON形式で送信するには、このパラメーターを設定する必要があります。

そうしないと、サーバーはHTTPステータスコード「400-badrequest」を返します。

con.setRequestProperty("Content-Type", "application/json");

2.5. 応答フォーマットタイプの設定

「Accept」リクエストヘッダーを「application/json」に設定して、目的の形式で応答を読み取ります。

con.setRequestProperty("Accept", "application/json");

2.6. 接続がコンテンツの送信に使用されることを確認します

リクエストコンテンツを送信するには、URLConnectionオブジェクトのdoOutputプロパティをtrueに有効にします。

そうしないと、接続出力ストリームにコンテンツを書き込むことができません。

con.setDoOutput(true);

2.7. リクエスト本文を作成する

カスタムJSON文字列を作成した後:

String jsonInputString = "{"name": "Upendra", "job": "Programmer"}";

私たちはそれを書く必要があるでしょう:

try(OutputStream os = con.getOutputStream()) {
    byte[] input = jsonInputString.getBytes("utf-8");
    os.write(input, 0, input.length);			
}

2.8. 入力ストリームからの応答を読み取る

入力ストリームを取得して、応答コンテンツを読み取ります。 try-with-resourcesを使用して、応答ストリームを自動的に閉じることを忘れないでください。

応答の内容全体を読み、最終的な応答文字列を出力します。

try(BufferedReader br = new BufferedReader(
  new InputStreamReader(con.getInputStream(), "utf-8"))) {
    StringBuilder response = new StringBuilder();
    String responseLine = null;
    while ((responseLine = br.readLine()) != null) {
        response.append(responseLine.trim());
    }
    System.out.println(response.toString());
}

応答がJSON形式の場合は、 Jackson library、 Gson org.jsonなどのサードパーティのJSONパーサーを使用して応答を解析します。

3. 結論

この記事では、HttpURLConnectionを使用してJSONコンテンツ本文でPOSTリクエストを作成する方法を学びました。

いつものように、関連するコードスニペットはGitHubにあります。