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 headers) { Request.Builder builder = new Request.Builder(); if (CollectionUtils.isEmpty(headers)) { logger.warn("请求头数据为空!返回无请求头的Builder!"); return builder; } Set> entries = headers.entrySet(); for (Map.Entry 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; } } }