MyHttpCaller.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package cn.com.taiji.dataService.utils;
  2. import cn.com.digitalhainan.apione.sdk.ApioneSignature;
  3. import cn.com.digitalhainan.apione.sdk.HttpCaller;
  4. import cn.com.digitalhainan.apione.sdk.HttpParameters;
  5. import cn.com.digitalhainan.apione.sdk.HttpReturn;
  6. import cn.com.digitalhainan.apione.utils.LogUtils;
  7. import cn.com.digitalhainan.apione.utils.ObjectUtils;
  8. import okhttp3.*;
  9. import okhttp3.internal.http.HttpMethod;
  10. import java.io.IOException;
  11. import java.util.concurrent.TimeUnit;
  12. import cn.com.digitalhainan.apione.utils.LogUtils;
  13. import cn.com.digitalhainan.apione.utils.ObjectUtils;
  14. import java.io.IOException;
  15. import java.util.Date;
  16. import java.util.HashMap;
  17. import java.util.Iterator;
  18. import java.util.Map;
  19. import java.util.TreeMap;
  20. import java.util.UUID;
  21. import java.util.concurrent.TimeUnit;
  22. import okhttp3.HttpUrl;
  23. import okhttp3.MediaType;
  24. import okhttp3.OkHttpClient;
  25. import okhttp3.Request;
  26. import okhttp3.RequestBody;
  27. import okhttp3.Response;
  28. import okhttp3.internal.http.HttpMethod;
  29. public class MyHttpCaller {
  30. private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
  31. public static final String CONNECT_TIMEOUT_KEY = "apione.http.connect.timeout";
  32. public static final String READ_TIMEOUT_KEY = "apione.http.read.timeout";
  33. public static final String WRITE_TIMEOUT_KEY = "apione_http.write.timeout";
  34. private static final String REGION_KEY = "region";
  35. private static final String REQUEST_ID = "x-request-id";
  36. private static final String PATH_KEY = "x-http-path";
  37. private static final String QUERY_KEY = "x-http-query";
  38. private OkHttpClient client;
  39. private MyHttpCaller() {
  40. OkHttpClient.Builder builder = new OkHttpClient.Builder();
  41. builder.connectTimeout((long)Integer.parseInt(System.getProperty("apione.http.connect.timeout", "60")), TimeUnit.SECONDS);
  42. builder.readTimeout((long)Integer.parseInt(System.getProperty("apione.http.read.timeout", "60")), TimeUnit.SECONDS);
  43. builder.writeTimeout((long)Integer.parseInt(System.getProperty("apione_http.write.timeout", "60")), TimeUnit.SECONDS);
  44. this.client = builder.build();
  45. }
  46. public static MyHttpCaller getInstance() {
  47. return OkHttpHolder.INSTANCE;
  48. }
  49. public HttpReturn call(HttpParameters httpParameters) {
  50. this.assertParams(httpParameters);
  51. String sign = ApioneSignature.sign(httpParameters.getApi(), httpParameters.getAccessKey(), httpParameters.getDate().getTime(), httpParameters.getSecretKey(), httpParameters.getFormParamsMap(), httpParameters.getVersion());
  52. RequestBody body = null;
  53. if (httpParameters.getContentBody() != null) {
  54. body = RequestBody.create(httpParameters.getMediaType(), httpParameters.getContentBody().getJsonBody());
  55. } else if (httpParameters.getMediaType().type().toLowerCase().contains("form") && !ObjectUtils.isEmpty(httpParameters.getFormParamsMap())) {
  56. body = RequestBody.create(httpParameters.getMediaType(), map2Form(httpParameters.getFormParamsMap()));
  57. }
  58. if (body == null && HttpMethod.requiresRequestBody(httpParameters.getMethod())) {
  59. body = RequestBody.create(httpParameters.getMediaType(), "");
  60. }
  61. HttpUrl.Builder urlBuilder = HttpUrl.parse(httpParameters.getRequestUrl()).newBuilder();
  62. Request.Builder builder = (new Request.Builder()).method(httpParameters.getMethod(), body);
  63. if (!ObjectUtils.isEmpty(httpParameters.getQueryParamsMap())) {
  64. httpParameters.getQueryParamsMap().forEach(urlBuilder::addQueryParameter);
  65. }
  66. TreeMap<String, String> sortedHeaderMap = new TreeMap(this.commonHeader(httpParameters, sign));
  67. if (httpParameters.getHeaderParamsMap() != null) {
  68. sortedHeaderMap.putAll(httpParameters.getHeaderParamsMap());
  69. }
  70. sortedHeaderMap.forEach(builder::header);
  71. HttpReturn httpReturn = new HttpReturn();
  72. try {
  73. Request request = builder.url(urlBuilder.build()).build();
  74. Response response = this.client.newCall(request).execute();
  75. httpReturn.setResponseHttpStatus(response.code()).setResponse(response.body().string());
  76. response.headers().toMultimap().forEach((key, values) -> {
  77. String var10000 = (String)httpReturn.getRespHttpHeaderMap().put(key, values.get(0));
  78. });
  79. return httpReturn;
  80. } catch (IOException var10) {
  81. LogUtils.error("call url:{} api:{} error:{}", new Object[]{httpParameters.getRequestUrl(), httpParameters.getApi(), var10.getMessage()});
  82. return httpReturn;
  83. }
  84. }
  85. public HttpByteReturn callByte(HttpParameters httpParameters) {
  86. this.assertParams(httpParameters);
  87. String sign = ApioneSignature.sign(httpParameters.getApi(), httpParameters.getAccessKey(), httpParameters.getDate().getTime(), httpParameters.getSecretKey(), httpParameters.getFormParamsMap(), httpParameters.getVersion());
  88. RequestBody body = null;
  89. if (httpParameters.getContentBody() != null) {
  90. body = RequestBody.create(httpParameters.getMediaType(), httpParameters.getContentBody().getJsonBody());
  91. } else if (httpParameters.getMediaType().type().toLowerCase().contains("form") && !ObjectUtils.isEmpty(httpParameters.getFormParamsMap())) {
  92. body = RequestBody.create(httpParameters.getMediaType(), map2Form(httpParameters.getFormParamsMap()));
  93. }
  94. if (body == null && HttpMethod.requiresRequestBody(httpParameters.getMethod())) {
  95. body = RequestBody.create(httpParameters.getMediaType(), "");
  96. }
  97. HttpUrl.Builder urlBuilder = HttpUrl.parse(httpParameters.getRequestUrl()).newBuilder();
  98. Request.Builder builder = (new Request.Builder()).method(httpParameters.getMethod(), body);
  99. if (!ObjectUtils.isEmpty(httpParameters.getQueryParamsMap())) {
  100. httpParameters.getQueryParamsMap().forEach(urlBuilder::addQueryParameter);
  101. }
  102. TreeMap<String, String> sortedHeaderMap = new TreeMap(this.commonHeader(httpParameters, sign));
  103. if (httpParameters.getHeaderParamsMap() != null) {
  104. sortedHeaderMap.putAll(httpParameters.getHeaderParamsMap());
  105. }
  106. sortedHeaderMap.forEach(builder::header);
  107. HttpByteReturn httpReturn = new HttpByteReturn();
  108. try {
  109. Request request = builder.url(urlBuilder.build()).build();
  110. Response response = this.client.newCall(request).execute();
  111. httpReturn.setResponseHttpStatus(response.code()).setResponse(response.body().byteStream());
  112. response.headers().toMultimap().forEach((key, values) -> {
  113. String var10000 = (String)httpReturn.getRespHttpHeaderMap().put(key, values.get(0));
  114. });
  115. return httpReturn;
  116. } catch (IOException var10) {
  117. LogUtils.error("call url:{} api:{} error:{}", new Object[]{httpParameters.getRequestUrl(), httpParameters.getApi(), var10.getMessage()});
  118. return httpReturn;
  119. }
  120. }
  121. public static String map2Form(Map<String, String> map) {
  122. StringBuilder stringBuilder = new StringBuilder();
  123. if (map == null) {
  124. return stringBuilder.toString();
  125. } else {
  126. Iterator var2 = map.entrySet().iterator();
  127. while(var2.hasNext()) {
  128. Map.Entry<String, String> entry = (Map.Entry)var2.next();
  129. stringBuilder.append((String)entry.getKey()).append("=").append((String)entry.getValue()).append("&");
  130. }
  131. return stringBuilder.substring(0, stringBuilder.length() - 1);
  132. }
  133. }
  134. private void assertParams(HttpParameters httpParameters) {
  135. if (httpParameters.getMethod() == null) {
  136. httpParameters.setMethod("POST");
  137. }
  138. if (httpParameters.getMediaType() == null) {
  139. httpParameters.setMediaType(JSON);
  140. }
  141. if (httpParameters.getDate() == null) {
  142. httpParameters.setDate(new Date());
  143. }
  144. if (ObjectUtils.isEmpty(httpParameters.getVersion())) {
  145. httpParameters.setVersion("1.0");
  146. }
  147. if (ObjectUtils.isEmpty(httpParameters.getAccessKey())) {
  148. throw new RuntimeException("Miss ak");
  149. } else if (ObjectUtils.isEmpty(httpParameters.getSecretKey())) {
  150. throw new RuntimeException("Miss sk");
  151. } else if (ObjectUtils.isEmpty(httpParameters.getApi())) {
  152. throw new RuntimeException("Miss api name");
  153. } else if (ObjectUtils.isEmpty(httpParameters.getRequestUrl())) {
  154. throw new RuntimeException("Miss request url");
  155. }
  156. }
  157. private Map<String, String> commonHeader(HttpParameters httpParameters, String sign) {
  158. Map<String, String> headerMap = new HashMap();
  159. headerMap.put("_api_name", httpParameters.getApi());
  160. headerMap.put("_api_access_key", httpParameters.getAccessKey());
  161. headerMap.put("_api_signature", sign);
  162. headerMap.put("_api_version", httpParameters.getVersion());
  163. headerMap.put("_api_timestamp", httpParameters.getDate().getTime() + "");
  164. String requestId = UUID.randomUUID().toString().replaceAll("-", "");
  165. headerMap.put("x-request-id", requestId);
  166. LogUtils.info("apione trace api = {} ,requestId = {}", new Object[]{httpParameters.getApi(), requestId});
  167. if (!ObjectUtils.isEmpty(httpParameters.getRegion())) {
  168. headerMap.put("region", httpParameters.getRegion());
  169. }
  170. if (!ObjectUtils.isEmpty(httpParameters.getPath())) {
  171. if (!httpParameters.getPath().startsWith("/")) {
  172. httpParameters.setPath("/" + httpParameters.getPath());
  173. }
  174. headerMap.put("x-http-path", httpParameters.getPath());
  175. }
  176. return headerMap;
  177. }
  178. private String getUrlParamsByMap(Map<String, String> map) {
  179. if (map == null) {
  180. return "";
  181. } else {
  182. StringBuffer sb = new StringBuffer();
  183. Iterator var3 = map.entrySet().iterator();
  184. while(var3.hasNext()) {
  185. Map.Entry<String, String> entry = (Map.Entry)var3.next();
  186. sb.append((String)entry.getKey() + "=" + (String)entry.getValue());
  187. sb.append("&");
  188. }
  189. String s = sb.toString();
  190. if (s.endsWith("&")) {
  191. s = ObjectUtils.substringBeforeLast(s, "&");
  192. }
  193. return s;
  194. }
  195. }
  196. private static class OkHttpHolder {
  197. private static final MyHttpCaller INSTANCE = new MyHttpCaller();
  198. private OkHttpHolder() {
  199. }
  200. }
  201. }