OkHttpUtils.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package com.kmall.admin.haikong.utils;
  2. import com.kmall.admin.utils.jackson.JacksonUtil;
  3. import okhttp3.*;
  4. import okhttp3.Response;
  5. import okio.Buffer;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.util.CollectionUtils;
  10. import javax.net.ssl.*;
  11. import java.io.IOException;
  12. import java.security.KeyManagementException;
  13. import java.security.NoSuchAlgorithmException;
  14. import java.security.SecureRandom;
  15. import java.security.cert.CertificateException;
  16. import java.security.cert.X509Certificate;
  17. import java.util.Map;
  18. import java.util.Objects;
  19. import java.util.Set;
  20. import java.util.concurrent.TimeUnit;
  21. import java.util.concurrent.atomic.AtomicInteger;
  22. /**
  23. * @author
  24. * @createDate 2021-10-27
  25. */
  26. public class OkHttpUtils {
  27. private static final Logger logger = LoggerFactory.getLogger(OkHttpUtils.class);
  28. public static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");
  29. public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
  30. public static final int CONNEC_TIME = 20;
  31. public static final int READ_TIME = 30;
  32. public static final int WRITE_TIME = 30;
  33. private static OkHttpClient okHttpClientSSL = null;
  34. static {
  35. okHttpClientSSL = new OkHttpClient.Builder()
  36. .sslSocketFactory(createSSLSocketFactory())
  37. .hostnameVerifier(new TrustAllHostnameVerifier())
  38. .connectTimeout(CONNEC_TIME, TimeUnit.SECONDS)
  39. .readTimeout(READ_TIME, TimeUnit.SECONDS)
  40. .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
  41. .build();
  42. }
  43. /**
  44. * 请求重试
  45. * @param request 请求
  46. * @param retry 重试次数
  47. */
  48. public static String retry(Request request, int retry) {
  49. AtomicInteger count = new AtomicInteger(1);
  50. while (count.get() <= retry) {
  51. try {
  52. Response responseDate = okHttpClientSSL.newCall(request).execute();
  53. if (responseDate.isSuccessful()) {
  54. String response = responseDate.body().string();
  55. count.set(99);
  56. logger.info("调用接口成功!\n==========================================================\n url:{} \n header:{} \n body:{} \n retry:{}" +
  57. "\n=========================================================="
  58. , request.url().toString()
  59. , JacksonUtil.toJson(request.headers())
  60. , JacksonUtil.toJson(Objects.isNull(request.body()) ? "" : getParamContent(request.body()))
  61. , count.get()
  62. );
  63. return response;
  64. }
  65. return "";
  66. } catch (IOException e) {
  67. logger.error("调用接口失败!重试中......\n==========================================================\n url:{} \n header:{} \n body:{} \n retry:{}" +
  68. "\n=========================================================="
  69. , request.url().toString()
  70. , JacksonUtil.toJson(request.headers())
  71. , JacksonUtil.toJson(Objects.isNull(request.body()) ? "" : request.body().contentType())
  72. , count.get()
  73. );
  74. count.incrementAndGet();
  75. }
  76. }
  77. return StringUtils.EMPTY;
  78. }
  79. private static String getParamContent(RequestBody requestBody) throws IOException {
  80. Buffer buffer = new Buffer();
  81. requestBody.writeTo(buffer);
  82. return buffer.readUtf8();
  83. }
  84. /**
  85. * 批量设置
  86. * @param headers 请求头信息
  87. * @return Builder
  88. */
  89. public static Request.Builder addHeaders(Map<String, String> headers) {
  90. Request.Builder builder = new Request.Builder();
  91. if (CollectionUtils.isEmpty(headers)) {
  92. logger.warn("请求头数据为空!返回无请求头的Builder!");
  93. return builder;
  94. }
  95. Set<Map.Entry<String, String>> entries = headers.entrySet();
  96. for (Map.Entry<String, String> entry : entries) {
  97. builder.addHeader(entry.getKey(), entry.getValue());
  98. }
  99. return builder;
  100. }
  101. public static void main(String[] args) {
  102. Request request = new Request.Builder().url("https://www.baidu.com").get().build();
  103. String retry = retry(request, 3);
  104. System.out.println(retry);
  105. }
  106. /**
  107. * 证书管理
  108. */
  109. private static TrustManager[] getTrustManager() {
  110. return new TrustManager[] {
  111. new X509TrustManager() {
  112. @Override
  113. public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  114. }
  115. @Override
  116. public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  117. }
  118. @Override
  119. public X509Certificate[] getAcceptedIssuers() {
  120. return new X509Certificate[0];
  121. }
  122. }
  123. };
  124. }
  125. private static SSLSocketFactory createSSLSocketFactory() {
  126. SSLSocketFactory sslSocketFactory = null;
  127. try {
  128. SSLContext sslContext = SSLContext.getInstance("TLS");
  129. sslContext.init(null, getTrustManager(), new SecureRandom());
  130. sslSocketFactory = sslContext.getSocketFactory();
  131. } catch (NoSuchAlgorithmException | KeyManagementException e) {
  132. logger.error("SSL初始化失败!", e);
  133. throw new RuntimeException(e);
  134. }
  135. return sslSocketFactory;
  136. }
  137. /**
  138. * 忽略验证
  139. */
  140. private static class TrustAllHostnameVerifier implements HostnameVerifier {
  141. @Override
  142. public boolean verify(String s, SSLSession sslSession) {
  143. return true;
  144. }
  145. }
  146. }