JSONファイルからhttpリクエスト情報を取得してhttpリクエストする

```json:requestURL.json
{
  "AService": "https://postman-echo.com/post",
  "BService": "https://postman-echo.com/get",
  "CService": "https://postman-echo.com/put"
}
```

```json:requestHeader.json
{
  "client-id": "id-hoge",
  "Authorization": "auth-info",
  "client-secret": "secret-hoge"
}
```

```json:requestBody.json
{
  "apiVer": "10.0",
  "list":[
    {
      "name": "hoge",
      "url": "http://hoge.com"
    },
    {
      "name": "fuga",
      "url": "http://fuga.com"
    }
  ]
}
```


```java:Main.java
package org.example;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        try {
            // JSONファイルをJavaオブジェクトにマッピングするためのObjectMapperインスタンスを生成
            ObjectMapper objectMapper = new ObjectMapper();

            // ローカル内のreqesutHeader.jsonを取得
            Map<String, Object> requestHeader = objectMapper.readValue(new File("./src/requestHeader.json"), Map.class);

            // ローカル内のreqesutBody.jsonを取得
            Map<String, Object> requestBody = objectMapper.readValue(new File("./src/requestBody.json"), Map.class);

            // Aサービスを呼び出す。POST
            String Aresponse = Util.AService(requestHeader, requestBody);
            System.out.println("Aサービスのレスポンスbody:" + Aresponse);
            // Bサービスを呼び出す。GET
            String Bresponse = Util.BService(requestHeader, "AA100", "010011110");
            System.out.println("Bサービスのレスポンスbody:" + Bresponse);

            // Cサービスを呼び出す。PUT
            String Cresponse = Util.CService(requestHeader, requestBody);
            System.out.println("Cサービスのレスポンスbody:" + Cresponse);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

```java:util.java
package org.example;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

public class Util {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    private static final String REQUEST_URL_FILE_PATH = "./src/requestURL.json";

    /**
     * Aサービスの実行を行います。HTTP POSTリクエストを使用して処理を実行します。
     *
     * @param headerJSON ヘッダー情報を含むMapオブジェクト
     * @param bodyJSON   ボディ情報を含むMapオブジェクト
     * @return サービスからのレスポンス文字列。
     * @throws Exception 例外が発生した場合にスローされます。
     */
    public static String AService(Map<String, Object> headerJSON, Map<String, Object> bodyJSON) throws Exception {
        // requestURL.jsonからAServiceのURLを取得
        Map<String, String> urlMap = objectMapper.readValue(new File(REQUEST_URL_FILE_PATH), new TypeReference<Map<String, String>>() {
        });
        String requestURL = urlMap.get("AService");

        // HTTP POSTリクエストを実行
        return HTTPRequestPOST(headerJSON, bodyJSON, requestURL);
    }

    /**
     * Bサービスの実行を行います。HTTP GETリクエストを使用して処理を実行します。
     *
     * @param headerJSON ヘッダー情報を含むMapオブジェクト
     * @param id      URLパラメータとして送信するID。
     * @param key     URLパラメータとして送信するキー。
     * @return サービスからのレスポンス文字列。
     * @throws Exception 通信エラーまたはファイル操作エラーが発生した場合。
     */
    public static String BService(Map<String, Object> headerJSON, String id, String key) throws Exception {
        // requestURL.jsonからBServiceのURLを取得
        Map<String, String> urlMap = objectMapper.readValue(new File(REQUEST_URL_FILE_PATH), new TypeReference<Map<String, String>>() {
        });
        String requestURL = urlMap.get("BService");
        requestURL += "?id=" + URLEncoder.encode(id, "UTF-8") + "&key=" + URLEncoder.encode(key, "UTF-8");

        return HTTPRequestGET(headerJSON, requestURL);
    }

    /**
     * Cサービスの実行を行います。HTTP PUTリクエストを使用して処理を実行します。
     *
     * @param headerJSON ヘッダー情報を含むMapオブジェクト
     * @param bodyJSON   ボディ情報を含むMapオブジェクト
     * @return サービスからのレスポンス文字列。
     * @throws Exception 例外が発生した場合にスローされます。
     */
    public static String CService(Map<String, Object> headerJSON, Map<String, Object> bodyJSON) throws Exception {
        // requestURL.jsonからCServiceのURLを取得
        Map<String, String> urlMap = objectMapper.readValue(new File(REQUEST_URL_FILE_PATH), new TypeReference<Map<String, String>>() {
        });
        String requestURL = urlMap.get("CService");

        // HTTP POSTリクエストを実行
        return HTTPRequestPUT(headerJSON, bodyJSON, requestURL);
    }

    /**
     * HTTP POSTリクエストを実行します。
     *
     * @param headerJSON ヘッダー情報を含むMapオブジェクト。
     * @param bodyJSON   ボディ情報を含むMapオブジェクト
     * @param requestURL リクエストを送信するURL
     * @return String型のレスポンスデータ
     * @throws Exception 例外が発生した場合にスローされます。
     */
    private static String HTTPRequestPOST(Map<String, Object> headerJSON, Map<String, Object> bodyJSON, String requestURL) throws Exception {
        URL url = new URL(requestURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        System.out.println("リクエストMethod : " + connection.getRequestMethod());
        connection.setDoInput(true);
        connection.setDoOutput(true);

        //リクエスト形式をJsonに指定
        connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");

        // ヘッダーのセット
        for (Map.Entry<String, Object> entry : headerJSON.entrySet()) {
            System.out.println("  " + entry.getKey() + ": " + entry.getValue());
            connection.setRequestProperty(entry.getKey(), entry.getValue().toString());
        }

        // ボディのセット
        try (OutputStream os = connection.getOutputStream()) {
            objectMapper.writeValue(os, bodyJSON);
        }

        //正常終了時はHttpStatusCode 200が返ってくる
        if (connection.getResponseCode() != 200) {
            //エラー処理
            System.out.println("HTTP POSTリクエストエラー : " + connection.getResponseCode());
        }
        //正常終了時はHttpStatusCode 200が返ってくる
        System.out.println("HTTP POSTステータス: " + connection.getResponseCode());

        // レスポンスの取得
        StringBuilder response = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        }

        return response.toString();
    }

    /**
     * 指定されたURLにHTTP GETリクエストを送信します。
     *
     * @param headerJSON ヘッダー情報を含むMapオブジェクト。
     * @param requestURL リクエストを送信するURL。
     * @return String型のレスポンスデータ
     * @throws Exception 通信エラーが発生した場合。
     */
    public static String HTTPRequestGET(Map<String, Object> headerJSON, String requestURL) throws Exception {
        URL url = new URL(requestURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        System.out.println("リクエストMethod : " + connection.getRequestMethod());


        // ヘッダーのセット
        for (Map.Entry<String, Object> entry : headerJSON.entrySet()) {
            System.out.println("  " + entry.getKey() + ": " + entry.getValue());
            connection.setRequestProperty(entry.getKey(), entry.getValue().toString());
        }
        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String inputLine;
        StringBuilder response = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        connection.disconnect();

        return response.toString();
    }

    /**
     * HTTP PUTリクエストを実行します。
     *
     * @param headerJSON ヘッダー情報を含むMapオブジェクト
     * @param bodyJSON   ボディ情報を含むMapオブジェクト
     * @param requestURL リクエストを送信するURL
     * @return String型のレスポンスデータ
     * @throws Exception 例外が発生した場合にスローされます。
     */
    private static String HTTPRequestPUT(Map<String, Object> headerJSON, Map<String, Object> bodyJSON, String requestURL) throws Exception {
        URL url = new URL(requestURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("PUT");
        System.out.println("リクエストMethod : " + connection.getRequestMethod());
        connection.setDoInput(true);
        connection.setDoOutput(true);

        //リクエスト形式をJsonに指定
        connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");

        // ヘッダーのセット
        for (Map.Entry<String, Object> entry : headerJSON.entrySet()) {
            System.out.println("  " + entry.getKey() + ": " + entry.getValue());
            connection.setRequestProperty(entry.getKey(), entry.getValue().toString());
        }

        // ボディのセット
        try (OutputStream os = connection.getOutputStream()) {
            objectMapper.writeValue(os, bodyJSON);
        }

        //正常終了時はHttpStatusCode 200が返ってくる
        if (connection.getResponseCode() != 200) {
            //エラー処理
            System.out.println("HTTP POSTリクエストエラー : " + connection.getResponseCode());
        }
        //正常終了時はHttpStatusCode 200が返ってくる
        System.out.println("HTTP POSTステータス: " + connection.getResponseCode());

        // レスポンスの取得
        StringBuilder response = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        }

        return response.toString();
    }
}
```