package com.dy.pipirrWebChat.util; import okhttp3.*; import org.jetbrains.annotations.NotNull; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /** * @author ZhuBaoMin * @date 2024-02-22 13:39 * @LastEditTime 2024-02-22 13:39 * @Description */ public class OkHttpUtil { private static volatile OkHttpClient okHttpClient = null; private static volatile Semaphore semaphore = null; private Map headerMap; private Map paramMap; private String url; private Request.Builder request; private String body; private OkHttpUtil() { if (Objects.isNull(okHttpClient)) { synchronized (OkHttpUtil.class) { if (Objects.isNull(okHttpClient)) { TrustManager[] trustManagers = buildTrustManager(); okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager)trustManagers[0]) .hostnameVerifier((hostname, session) -> true) .retryOnConnectionFailure(true) .build(); addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"); } } } } public OkHttpUtil initGet() { request = new Request.Builder().get(); StringBuilder builder = new StringBuilder(url); if (Objects.nonNull(paramMap)) { builder.append("?"); paramMap.forEach((key, value) -> { try { builder.append(URLEncoder.encode(key, "utf-8")) .append("=") .append(URLEncoder.encode((String)value, "utf-8")) .append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }); builder.deleteCharAt(builder.length() - 1); } request.url(builder.toString()); return this; } public OkHttpUtil initPost(boolean isJson) { RequestBody requestBody = null; if (isJson) { requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), body); } else { FormBody.Builder formBody = new FormBody.Builder(); if (Objects.nonNull(paramMap)) { paramMap.forEach((x, y) -> formBody.add(x, (String) y)); } requestBody = formBody.build(); } request = new Request.Builder().post(requestBody).url(url); return this; } /** * @Description:同步请求 * @Author: zzc * @Date: 2022-12-04 18:06 * @return: java.lang.String **/ public String sync() throws Exception { setHeader(request); try { Response result = okHttpClient.newCall(request.build()).execute(); if (result.isSuccessful()) { return result.body().string(); } throw new Exception(result.body().string()); } catch (IOException e) { throw new Exception(e.getMessage()); } } /** * @Description:异步请求,有返回值 * @Author: zzc * @Date: 2022-12-04 18:05 * @return: java.lang.String **/ public String async() { StringBuffer buffer = new StringBuffer(); setHeader(request); okHttpClient.newCall(request.build()).enqueue(new Callback() { @Override public void onResponse(@NotNull okhttp3.Call call, @NotNull Response response) throws IOException { if (Objects.nonNull(response.body())) { buffer.append(response.body().string()); getSemaphore().release(); } } @Override public void onFailure(@NotNull okhttp3.Call call, @NotNull IOException e) { buffer.append("请求出错").append(e.getMessage()); } }); try { getSemaphore().acquire(); } catch (InterruptedException e) { e.printStackTrace(); } return buffer.toString(); } private static Semaphore getSemaphore() { synchronized (OkHttpUtil.class) { if (Objects.isNull(semaphore)) { semaphore = new Semaphore(0); } } return semaphore; } public static OkHttpUtil builder() { return new OkHttpUtil(); } public OkHttpUtil url(String url) { this.url = url; return this; } public OkHttpUtil addParam(String key, String value) { if (Objects.isNull(paramMap)) { paramMap = new LinkedHashMap<>(16); } paramMap.put(key, value); return this; } public OkHttpUtil addBody(String body) { this.body = body; return this; } public void setHeader(Request.Builder request) { if (Objects.nonNull(headerMap)) { headerMap.forEach(request::addHeader); } } public OkHttpUtil addHeader(String key, String value) { if (Objects.isNull(headerMap)) { headerMap = new LinkedHashMap<>(16); } headerMap.put(key, value); return this; } /** * @Description:生成安全套接字工厂,用于Https请求的证书跳过 * @Author: zzc * @Date: 2022-11-30 16:03 * @param trustManagers: * @return: javax.net.ssl.SSLSocketFactory **/ //private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustManagers) { // SSLSocketFactory sslSocketFactory = null; // try { // SSLContext ssl = SSLContext.getInstance("SSL"); // ssl.init(null, trustManagers, new SecureRandom()); // sslSocketFactory = ssl.getSocketFactory(); // } catch (Exception e) { // e.printStackTrace(); // } // return sslSocketFactory; //} private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustManagers) { SSLSocketFactory sslSocketFactory = null; try { SSLContext ssl = SSLContext.getInstance("SSL"); ssl.init(null, trustManagers, new SecureRandom()); sslSocketFactory = ssl.getSocketFactory(); } catch (Exception e) { e.printStackTrace(); } return sslSocketFactory; } private static TrustManager[] buildTrustManager() { return new TrustManager[] { new X509TrustManager() { @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }; } }