|
@@ -0,0 +1,159 @@
|
|
|
|
+package com.kmall.admin.utils.haikong;
|
|
|
|
+
|
|
|
|
+import com.kmall.admin.utils.jackson.JacksonUtil;
|
|
|
|
+import okhttp3.MediaType;
|
|
|
|
+import okhttp3.OkHttpClient;
|
|
|
|
+import okhttp3.Request;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
+
|
|
|
|
+import javax.net.ssl.*;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.security.KeyManagementException;
|
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
|
+import java.security.SecureRandom;
|
|
|
|
+import java.security.cert.CertificateException;
|
|
|
|
+import java.security.cert.X509Certificate;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.Objects;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author
|
|
|
|
+ * @createDate 2021-10-27
|
|
|
|
+ */
|
|
|
|
+public class OkHttpUtils {
|
|
|
|
+
|
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(OkHttpUtils.class);
|
|
|
|
+
|
|
|
|
+ public static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");
|
|
|
|
+ public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
|
|
|
|
+
|
|
|
|
+ public static final int CONNEC_TIME = 20;
|
|
|
|
+ public static final int READ_TIME = 30;
|
|
|
|
+ public static final int WRITE_TIME = 30;
|
|
|
|
+ private static OkHttpClient okHttpClientSSL = null;
|
|
|
|
+ static {
|
|
|
|
+ okHttpClientSSL = new OkHttpClient.Builder()
|
|
|
|
+ .sslSocketFactory(createSSLSocketFactory())
|
|
|
|
+ .hostnameVerifier(new TrustAllHostnameVerifier())
|
|
|
|
+ .connectTimeout(CONNEC_TIME, TimeUnit.SECONDS)
|
|
|
|
+ .readTimeout(READ_TIME, TimeUnit.SECONDS)
|
|
|
|
+ .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
|
|
|
|
+ .build();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 请求重试
|
|
|
|
+ * @param request 请求
|
|
|
|
+ * @param retry 重试次数
|
|
|
|
+ */
|
|
|
|
+ public static String retry(Request request, int retry) {
|
|
|
|
+
|
|
|
|
+ AtomicInteger count = new AtomicInteger(1);
|
|
|
|
+ while (count.get() <= retry) {
|
|
|
|
+ try {
|
|
|
|
+ String response = okHttpClientSSL.newCall(request).execute().body().string();
|
|
|
|
+ count.set(99);
|
|
|
|
+ return response;
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ logger.error("调用接口失败!重试中......\n==========================================================\n url:{} \n header:{} \n body:{} \n retry:{}" +
|
|
|
|
+ "\n=========================================================="
|
|
|
|
+ , request.url().toString()
|
|
|
|
+ , JacksonUtil.toJson(request.headers())
|
|
|
|
+ , JacksonUtil.toJson(Objects.isNull(request.body()) ? "" : request.body().contentType())
|
|
|
|
+ , count.get()
|
|
|
|
+ );
|
|
|
|
+ count.incrementAndGet();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return StringUtils.EMPTY;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量设置
|
|
|
|
+ * @param headers 请求头信息
|
|
|
|
+ * @return Builder
|
|
|
|
+ */
|
|
|
|
+ public static Request.Builder addHeaders(Map<String, String> headers) {
|
|
|
|
+ Request.Builder builder = new Request.Builder();
|
|
|
|
+ if (CollectionUtils.isEmpty(headers)) {
|
|
|
|
+ logger.warn("请求头数据为空!返回无请求头的Builder!");
|
|
|
|
+ return builder;
|
|
|
|
+ }
|
|
|
|
+ Set<Map.Entry<String, String>> entries = headers.entrySet();
|
|
|
|
+ for (Map.Entry<String, String> entry : entries) {
|
|
|
|
+ builder.addHeader(entry.getKey(), entry.getValue());
|
|
|
|
+ }
|
|
|
|
+ return builder;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+
|
|
|
|
+ Request request = new Request.Builder().url("https://www.baidu.com").get().build();
|
|
|
|
+
|
|
|
|
+ String retry = retry(request, 3);
|
|
|
|
+
|
|
|
|
+ System.out.println(retry);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 证书管理
|
|
|
|
+ */
|
|
|
|
+ private static TrustManager[] getTrustManager() {
|
|
|
|
+ return new TrustManager[] {
|
|
|
|
+ new X509TrustManager() {
|
|
|
|
+ @Override
|
|
|
|
+ public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public X509Certificate[] getAcceptedIssuers() {
|
|
|
|
+ return new X509Certificate[0];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static SSLSocketFactory createSSLSocketFactory() {
|
|
|
|
+ SSLSocketFactory sslSocketFactory = null;
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ SSLContext sslContext = SSLContext.getInstance("TLS");
|
|
|
|
+ sslContext.init(null, getTrustManager(), new SecureRandom());
|
|
|
|
+
|
|
|
|
+ sslSocketFactory = sslContext.getSocketFactory();
|
|
|
|
+ } catch (NoSuchAlgorithmException | KeyManagementException e) {
|
|
|
|
+ logger.error("SSL初始化失败!", e);
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return sslSocketFactory;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 忽略验证
|
|
|
|
+ */
|
|
|
|
+ private static class TrustAllHostnameVerifier implements HostnameVerifier {
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean verify(String s, SSLSession sslSession) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|