共通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; } }