Skip to content

共通HTTPリクエストクラス実装例#

1.1. 実装例#

以下共通で使用するリクエストクラスの実装例となります。
※本マニュアルに記載している実装例は、分かりやすさを優先し簡易的に記載しております。提供しているソースと異なりますので詳細については提供ソースをご確認ください。

CommonHttpClient.java

public class CommonHttpClient {

    /** ロガー */
    private static Logger logger = Logger.getLogger(ServiceMasterListController.class);

    private static final int TIMEOUT = 5000;

    /**
     * アクセストークン取得
     * @return アクセストークン
     * @throws IOException 
     */
    private static String accessTokenGet() throws IOException {

        // 通信設定
        CloseableHttpClient httpClient = ClientUtil.Client_settings();
        String mapQueryString = new String();
        mapQueryString = UriInfo.grant_type + "=client_credentials";
        mapQueryString += "&" + UriInfo.scope + "=service_contract";
        mapQueryString += "&" + UriInfo.client_id + "=" + EnvDepUriInfo.クライアントID;
        mapQueryString += "&" + UriInfo.client_secret + "=" + EnvDepUriInfo.クライアントパスワード;
        String strURI = ClientUtil.makeURI(EnvDepUriInfo.API認証通信先URL, EnvDepUriInfo.アクセストークンを取得するURI, null, null);
        HttpPost postMethod = ClientUtil.makeHttpPost_Authentication(strURI, mapQueryString);

        Gson gson = new Gson();
        Web_ApiAuth_AccessTokenGet accessTokenGet = new Web_ApiAuth_AccessTokenGet();
        // POSTメソッドにて通信実行
        try (CloseableHttpResponse response = httpClient.execute(postMethod)) {
            // HTTPステータスコードの取得
            int httpStatusCode = response.getStatusLine().getStatusCode();
            // HTTPステータスコードの確認
            switch (httpStatusCode) {
            case HttpStatus.SC_OK:
            case HttpStatus.SC_CREATED:
                // 戻り値取得
                HttpEntity entity = response.getEntity();
                // 戻り値のJSONをJAVAクラスに変換
                accessTokenGet = gson.fromJson(
                        EntityUtils.toString(entity, StandardCharsets.UTF_8),
                        Web_ApiAuth_AccessTokenGet.class);
                break;
            default:
                // その他は500系エラー 業務不整合
                throw new ApiException(ApiErrorType.業務不整合, response);
            }
        } catch (IOException e) {
            throw e;
        }

        return accessTokenGet.access_token;

    }

    /**
     * GETメソッドを実行しHttpEntityを返す
     * @param getMethod HttpGet
     * @param outputClass Class
     * @return HttpEntity
     */
    public static <OutputClass> OutputClass httpGet(HttpGet getMethod, Class<OutputClass> outputClass) {

        return httpExecute(getMethod, outputClass);
    }

    /**
     * POSTメソッドを実行しHttpEntityを返す
     * @param getMethod HttpGet
     * @param outputClass Class
     * @return HttpEntity
     */
    public static <OutputClass> OutputClass httpPost(HttpPost postMethod, Class<OutputClass> outputClass) {

        return httpExecute(postMethod, outputClass);
    }

    /**
     * POSTメソッドを実行しHttpEntityを返す
     * @param putMethod HttpPut
     * @param outputClass Class
     * @return HttpEntity
     */
    public static <OutputClass> OutputClass httpPut(HttpPut putMethod, Class<OutputClass> outputClass) {

        return httpExecute(putMethod, outputClass);
    }

    /**
     * POSTメソッドを実行しHttpEntityを返す
     * @param putMethod HttpPut
     * @param outputClass Class
     * @return HttpEntity
     */
    public static <OutputClass> OutputClass httpDelete(HttpDelete deleteMethod, Class<OutputClass> outputClass) {

        return httpExecute(deleteMethod, outputClass);
    }

    /**
     * GET/POST/PUT/DELETEメソッドを実行しHttpEntityを返す
     * @param httpRequestBase GET/POST/PUT/DELETEメソッド
     * @param outputClass Class
     * @return HttpEntity
     */
    private static <OutputClass> OutputClass httpExecute(HttpRequestBase httpRequestBase, Class<OutputClass> outputClass) {

        Gson gson = new Gson();
        HttpEntity entity =  null;
        try {
            // POSTメソッドにて通信実行
            CloseableHttpResponse response = execute(httpRequestBase);
            // HTTPステータスコードの取得
            int httpStatusCode = response.getStatusLine().getStatusCode();
            // HTTPステータスコードの確認
            switch (httpStatusCode) {
            case HttpStatus.SC_OK:
                // HTTP : 200
                // 戻り値取得
                entity = response.getEntity();

                // 戻り値のJSONをJAVAクラスに変換
                return gson.fromJson(
                        EntityUtils.toString(entity, StandardCharsets.UTF_8),
                        outputClass);

            case HttpStatus.SC_BAD_REQUEST:
                // HTTP : 400 パラメータ不整合
                throw new ApiException(ApiErrorType.パラメータ不整合, response);

            case HttpStatus.SC_UNAUTHORIZED:
                // HTTP : 401 API認証連携失敗
                throw new ApiException(ApiErrorType.API認証連携失敗, response);

            case HttpStatus.SC_FORBIDDEN:
                // HTTP : 403 権限なし
                throw new ApiException(ApiErrorType.権限なし, response);

            case HttpStatus.SC_NOT_FOUND:
                // HTTP : 404 対象なし
                throw new ApiException(ApiErrorType.対象なし, response);

            case HttpStatus.SC_CONFLICT:
                // HTTP : 409 排他エラー
                throw new ApiException(ApiErrorType.排他エラー, response);

            default:
                // その他は500系エラー 業務不整合
                throw new ApiException(ApiErrorType.業務不整合, response);
            }
        } catch (ApiException e1) {
            throw e1;

        } catch (IOException e2) {
            // システムエラー
            logger.error(ApiErrorType.システムエラー.name(), e2);
            throw new ApiException(ApiErrorType.システムエラー, null);
        }
    }

    /**
     * GET/POST/PUT/DELETEメソッドを実行する
     * @param httpRequestBase GET/POST/PUT/DELETEメソッド
     * @return CloseableHttpResponse
     * @throws IOException 
     */
    private static CloseableHttpResponse execute(HttpRequestBase httpRequestBase) throws IOException {

        int retryCount = 0;

        CloseableHttpClient httpClient = ClientUtil.Client_settings();
        CloseableHttpResponse response = null;

        RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(TIMEOUT)
                .setConnectTimeout(TIMEOUT)
                .setConnectionRequestTimeout(TIMEOUT)
                .build();
        httpRequestBase.setConfig(requestConfig);

        // アクセストークンの期限切れの確認のため、SC_FORBIDDENの場合は最大2回まで
        while (retryCount < 2) {
            // DELETEメソッドにて通信実行
            try {
                httpRequestBase.addHeader("Access-Token", accessTokenGet());

                response = httpClient.execute(httpRequestBase);
                // HTTPステータスコードの取得
                int httpStatusCode = response.getStatusLine().getStatusCode();
                // HTTPステータスコードの確認
                if (httpStatusCode != HttpStatus.SC_FORBIDDEN) {
                    break;
                }
            } catch (IOException e) {
                throw e;
            }
            retryCount++;
        }

        return response;
    }
}

Top