OkHttpUtils.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package com.sckw.robot.util;
  2. import com.alibaba.fastjson2.JSONObject;
  3. import lombok.extern.slf4j.Slf4j;
  4. import okhttp3.*;
  5. import org.apache.commons.lang3.StringUtils;
  6. import javax.net.ssl.SSLContext;
  7. import javax.net.ssl.SSLSocketFactory;
  8. import javax.net.ssl.TrustManager;
  9. import javax.net.ssl.X509TrustManager;
  10. import java.io.IOException;
  11. import java.net.URLEncoder;
  12. import java.nio.charset.StandardCharsets;
  13. import java.security.SecureRandom;
  14. import java.security.cert.X509Certificate;
  15. import java.util.LinkedHashMap;
  16. import java.util.Map;
  17. import java.util.concurrent.Semaphore;
  18. import java.util.concurrent.TimeUnit;
  19. @Slf4j
  20. public class OkHttpUtils {
  21. private static volatile OkHttpClient okHttpClient;
  22. private static final Semaphore semaphore = new Semaphore(0);
  23. private final Map<String, String> headerMap = new LinkedHashMap<>();
  24. private final Map<String, String> paraMap = new LinkedHashMap<>();
  25. private final Map<String, String> bodyParaMap = new LinkedHashMap<>();
  26. private String bodyParaString;
  27. private String url;
  28. private Request.Builder request;
  29. static {
  30. try {
  31. TrustManager[] trustManagers = buildTrustManagers();
  32. okHttpClient = new OkHttpClient.Builder()
  33. .connectTimeout(15, TimeUnit.SECONDS)
  34. .writeTimeout(20, TimeUnit.SECONDS)
  35. .readTimeout(20, TimeUnit.SECONDS)
  36. .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
  37. .hostnameVerifier((hostName, session) -> true)
  38. .retryOnConnectionFailure(true)
  39. .build();
  40. } catch (Exception e) {
  41. log.error("Failed to initialize OkHttpClient", e);
  42. }
  43. }
  44. public static OkHttpUtils builder() {
  45. return new OkHttpUtils();
  46. }
  47. public OkHttpUtils url(String url) {
  48. this.url = url;
  49. return this;
  50. }
  51. public OkHttpUtils addPara(String key, String value) {
  52. this.paraMap.put(key, value);
  53. return this;
  54. }
  55. public OkHttpUtils addBodyPara(String key, String value) {
  56. this.bodyParaMap.put(key, value);
  57. return this;
  58. }
  59. public OkHttpUtils addBodyJsonStr(String string) {
  60. this.bodyParaString = string;
  61. return this;
  62. }
  63. public OkHttpUtils addHeader(String key, String value) {
  64. this.headerMap.put(key, value);
  65. return this;
  66. }
  67. public OkHttpUtils addHeaderMap(Map<String, String> map) {
  68. this.headerMap.putAll(map);
  69. return this;
  70. }
  71. public OkHttpUtils get() {
  72. this.request = new Request.Builder().get().url(buildUrl());
  73. return this;
  74. }
  75. public OkHttpUtils post(boolean isJsonPost) {
  76. RequestBody requestBody;
  77. if (isJsonPost) {
  78. String json = StringUtils.isNotBlank(bodyParaString) ? bodyParaString : JSONObject.toJSONString(bodyParaMap);
  79. requestBody = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
  80. } else {
  81. FormBody.Builder formBody = new FormBody.Builder();
  82. bodyParaMap.forEach(formBody::add);
  83. requestBody = formBody.build();
  84. }
  85. this.request = new Request.Builder().post(requestBody).url(buildUrl());
  86. return this;
  87. }
  88. private String buildUrl() {
  89. if (paraMap.isEmpty()) return this.url;
  90. StringBuilder urlBuilder = new StringBuilder(this.url).append("?");
  91. paraMap.forEach((key, value) -> {
  92. try {
  93. urlBuilder.append(URLEncoder.encode(key, StandardCharsets.UTF_8))
  94. .append("=")
  95. .append(URLEncoder.encode(value, StandardCharsets.UTF_8))
  96. .append("&");
  97. } catch (Exception e) {
  98. log.warn("Parameter encoding failed: {}={}", key, value, e);
  99. }
  100. });
  101. urlBuilder.deleteCharAt(urlBuilder.length() - 1);
  102. return urlBuilder.toString();
  103. }
  104. public String sync() {
  105. setHeaders();
  106. try (Response response = okHttpClient.newCall(request.build()).execute()) {
  107. if (response.body() != null) {
  108. return response.body().string();
  109. }
  110. } catch (IOException e) {
  111. log.error("Sync request failed", e);
  112. }
  113. return null;
  114. }
  115. public String async() {
  116. final StringBuilder buffer = new StringBuilder();
  117. setHeaders();
  118. okHttpClient.newCall(request.build()).enqueue(new Callback() {
  119. @Override
  120. public void onFailure(Call call, IOException e) {
  121. log.error("Async request failed", e);
  122. buffer.append("请求失败:").append(e.getMessage());
  123. semaphore.release();
  124. }
  125. @Override
  126. public void onResponse(Call call, Response response) throws IOException {
  127. if (response.body() != null) {
  128. buffer.append(response.body().string());
  129. }
  130. semaphore.release();
  131. }
  132. });
  133. try {
  134. semaphore.acquire();
  135. } catch (InterruptedException e) {
  136. Thread.currentThread().interrupt();
  137. log.error("Semaphore interrupted", e);
  138. }
  139. return buffer.toString();
  140. }
  141. public void async(ICallBack callBack) {
  142. setHeaders();
  143. okHttpClient.newCall(request.build()).enqueue(new Callback() {
  144. @Override
  145. public void onFailure(Call call, IOException e) {
  146. callBack.onFailure(call, e.getMessage());
  147. }
  148. @Override
  149. public void onResponse(Call call, Response response) throws IOException {
  150. if (response.body() != null) {
  151. callBack.onSuccessful(call, response.body().string());
  152. }
  153. }
  154. });
  155. }
  156. private void setHeaders() {
  157. headerMap.forEach((k, v) -> request.addHeader(k, v));
  158. }
  159. private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) throws Exception {
  160. SSLContext sc = SSLContext.getInstance("SSL");
  161. sc.init(null, trustAllCerts, new SecureRandom());
  162. return sc.getSocketFactory();
  163. }
  164. private static TrustManager[] buildTrustManagers() {
  165. return new TrustManager[]{
  166. new X509TrustManager() {
  167. @Override
  168. public void checkClientTrusted(X509Certificate[] chain, String authType) {}
  169. @Override
  170. public void checkServerTrusted(X509Certificate[] chain, String authType) {}
  171. @Override
  172. public X509Certificate[] getAcceptedIssuers() {
  173. return new X509Certificate[0];
  174. }
  175. }
  176. };
  177. }
  178. public interface ICallBack {
  179. void onSuccessful(Call call, String data);
  180. void onFailure(Call call, String errorMsg);
  181. }
  182. }