<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.8.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>
package com.frcoder;import com.alibaba.fastjson.JSON;import okhttp3.Call;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;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.net.URLEncoder;import java.security.SecureRandom;import java.security.cert.X509Certificate;import java.util.LinkedHashMap;import java.util.Map;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class OkHttpUtils {private static volatile OkHttpClient okHttpClient = null;private static volatile Semaphore semaphore = null;private Map<String, String> headerMap;private Map<String, String> paramMap;private Map<String, String> formMap;private Object body;private String url;private Request.Builder request;/** * 初始化okHttpClient,并且允许https访问 */private OkHttpUtils() {if (okHttpClient == null) {synchronized (OkHttpUtils.class) {if (okHttpClient == null) {TrustManager[] trustManagers = buildTrustManagers();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 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");}}}}/** * 用于异步请求时,控制访问线程数,返回结果 */private static Semaphore getSemaphoreInstance() {// 只能1个线程同时访问synchronized (OkHttpUtils.class) {if (semaphore == null) {semaphore = new Semaphore(0);}}return semaphore;}/** * 创建OkHttpUtils */public static OkHttpUtils builder() {return new OkHttpUtils();}/** * 添加url */public OkHttpUtils url(String url) {this.url = url;return this;}/** * 添加body */public OkHttpUtils body(Object body) {this.body = body;return this;}/** * 添加参数 */public OkHttpUtils addParam(String key, String value) {if (paramMap == null) {paramMap = new LinkedHashMap<>(16);}paramMap.put(key, value);return this;}/** * 添加参数 */public OkHttpUtils addFormParam(String key, String value) {if (formMap == null) {formMap = new LinkedHashMap<>(16);}formMap.put(key, value);return this;}/** * 添加请求头 */public OkHttpUtils addHeader(String key, String value) {if (headerMap == null) {headerMap = new LinkedHashMap<>(16);}headerMap.put(key, value);return this;}/** * 初始化get方法 */public OkHttpUtils get() {request = new Request.Builder().get();StringBuilder urlBuilder = new StringBuilder(url);if (paramMap != null) {urlBuilder.append("?");try {for (Map.Entry<String, String> entry : paramMap.entrySet()) {urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8")).append("&");}} catch (Exception e) {e.printStackTrace();}urlBuilder.deleteCharAt(urlBuilder.length() - 1);}request.url(urlBuilder.toString());return this;}/** * 初始化post方法 */public OkHttpUtils post() {RequestBody requestBody = null;StringBuilder urlBuilder = new StringBuilder(url);if (paramMap != null) {urlBuilder.append("?");try {for (Map.Entry<String, String> entry : paramMap.entrySet()) {urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8")).append("&");}} catch (Exception e) {e.printStackTrace();}urlBuilder.deleteCharAt(urlBuilder.length() - 1);}if (formMap != null) {FormBody.Builder formBody = new FormBody.Builder();if (formMap != null) {formMap.forEach(formBody::add);}requestBody = formBody.build();}if (requestBody == null) {if (body == null) {body = new Object();}String json = JSON.toJSONString(body);requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);}request = new Request.Builder().post(requestBody).url(urlBuilder.toString());return this;}/** * 同步请求 */public String sync() {setHeader(request);try {Request req = request.build();System.out.println(req);System.out.println(JSON.toJSONString(req.body()));Response response = okHttpClient.newCall(req).execute();assert response.body() != null;String resp = response.body().string();return resp;} catch (IOException e) {e.printStackTrace();return "请求失败:" + e.getMessage();}}/** * 异步请求,有返回值 */public String async() {StringBuilder buffer = new StringBuilder("");setHeader(request);Request req = request.build();okHttpClient.newCall(req).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {buffer.append("请求出错:").append(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {assert response.body() != null;buffer.append(response.body().string());getSemaphoreInstance().release();}});try {getSemaphoreInstance().acquire();} catch (InterruptedException e) {e.printStackTrace();}String resp = buffer.toString();return resp;}/** * 异步请求,带有接口回调 */public void async(ICallBack callBack) {setHeader(request);Request req = request.build();System.out.println(JSON.toJSONString(req));okHttpClient.newCall(req).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {callBack.onFailure(call, e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {assert response.body() != null;callBack.onSuccessful(call, response.body().string());}});}/** * 为request添加请求头 */private void setHeader(Request.Builder request) {if (headerMap != null) {try {for (Map.Entry<String, String> entry : headerMap.entrySet()) {request.addHeader(entry.getKey(), entry.getValue());}} catch (Exception e) {e.printStackTrace();}}}/** * 生成安全套接字工厂,用于https请求的证书跳过 */private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {SSLSocketFactory ssfFactory = null;try {SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, new SecureRandom());ssfFactory = sc.getSocketFactory();} catch (Exception e) {e.printStackTrace();}return ssfFactory;}private static TrustManager[] buildTrustManagers() {return new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};}/** * 自定义一个接口回调 */public interface ICallBack {void onSuccessful(Call call, String data);void onFailure(Call call, String errorMsg);}public static void main(String[] args) {// get请求,方法顺序按照这种方式,切记选择post/get一定要放在倒数第二,同步或者异步倒数第一,才会正确执行OkHttpUtils.builder().url("http://baidu.com").addHeader("Content-Type", "application/json; charset=utf-8")// 有参数的话添加参数,可多个.addParam("param1", "a").addParam("param2", "b")// 也可以添加多个.get()// 可选择是同步请求还是异步请求//.async();.sync();}}