389 lines
12 KiB
Java
389 lines
12 KiB
Java
![]() |
package com.mosty.bkzx.utlis;
|
|||
|
|
|||
|
import com.alibaba.fastjson.JSON;
|
|||
|
import okhttp3.*;
|
|||
|
|
|||
|
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, Object> paramMap;
|
|||
|
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");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 用于异步请求时,控制访问线程数,返回结果
|
|||
|
*
|
|||
|
* @return
|
|||
|
*/
|
|||
|
private static Semaphore getSemaphoreInstance() {
|
|||
|
//只能1个线程同时访问
|
|||
|
synchronized (OkHttpUtils.class) {
|
|||
|
if (semaphore == null) {
|
|||
|
semaphore = new Semaphore(0);
|
|||
|
}
|
|||
|
}
|
|||
|
return semaphore;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 创建OkHttpUtils
|
|||
|
*
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public static OkHttpUtils builder() {
|
|||
|
return new OkHttpUtils();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 添加url
|
|||
|
*
|
|||
|
* @param url
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils url(String url) {
|
|||
|
this.url = url;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 添加参数
|
|||
|
*
|
|||
|
* @param key 参数名
|
|||
|
* @param value 参数值
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils addParam(String key, Object value) {
|
|||
|
if (paramMap == null) {
|
|||
|
paramMap = new LinkedHashMap<>(16);
|
|||
|
}
|
|||
|
paramMap.put(key, value);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 添加请求头
|
|||
|
*
|
|||
|
* @param key 参数名
|
|||
|
* @param value 参数值
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils addHeader(String key, String value) {
|
|||
|
if (headerMap == null) {
|
|||
|
headerMap = new LinkedHashMap<>(16);
|
|||
|
}
|
|||
|
headerMap.put(key, value);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 初始化get方法
|
|||
|
*
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils get() {
|
|||
|
request = new Request.Builder().get();
|
|||
|
StringBuilder urlBuilder = new StringBuilder(url);
|
|||
|
if (paramMap != null) {
|
|||
|
urlBuilder.append("?");
|
|||
|
try {
|
|||
|
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
|
|||
|
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).append("=").append(URLEncoder.encode(entry.getValue().toString(), "utf-8")).append("&");
|
|||
|
}
|
|||
|
} catch (Exception e) {
|
|||
|
e.printStackTrace();
|
|||
|
}
|
|||
|
urlBuilder.deleteCharAt(urlBuilder.length() - 1);
|
|||
|
}
|
|||
|
request.url(urlBuilder.toString());
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 初始化delet方法
|
|||
|
*
|
|||
|
* @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
|
|||
|
* false等于普通的表单提交
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils delete(boolean isJsonPost) {
|
|||
|
RequestBody requestBody;
|
|||
|
if (isJsonPost) {
|
|||
|
String json = "";
|
|||
|
if (paramMap != null) {
|
|||
|
json = JSON.toJSONString(paramMap);
|
|||
|
}
|
|||
|
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
|
|||
|
} else {
|
|||
|
FormBody.Builder formBody = new FormBody.Builder();
|
|||
|
if (paramMap != null) {
|
|||
|
paramMap.forEach((key,value) ->{
|
|||
|
formBody.add(key,String.valueOf(value));
|
|||
|
});
|
|||
|
}
|
|||
|
requestBody = formBody.build();
|
|||
|
}
|
|||
|
request = new Request.Builder().delete(requestBody).url(url);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 初始化post方法
|
|||
|
*
|
|||
|
* @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
|
|||
|
* false等于普通的表单提交
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils post(boolean isJsonPost) {
|
|||
|
RequestBody requestBody;
|
|||
|
if (isJsonPost) {
|
|||
|
String json = "";
|
|||
|
if (paramMap != null) {
|
|||
|
json = JSON.toJSONString(paramMap);
|
|||
|
}
|
|||
|
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
|
|||
|
} else {
|
|||
|
FormBody.Builder formBody = new FormBody.Builder();
|
|||
|
if (paramMap != null) {
|
|||
|
paramMap.forEach((key,value) ->{
|
|||
|
formBody.add(key,String.valueOf(value));
|
|||
|
});
|
|||
|
}
|
|||
|
requestBody = formBody.build();
|
|||
|
}
|
|||
|
|
|||
|
request = new Request.Builder().post(requestBody).url(url);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
public OkHttpUtils post(Map<String,Object> data,boolean isJsonPost) {
|
|||
|
RequestBody requestBody;
|
|||
|
if (isJsonPost) {
|
|||
|
String json = "";
|
|||
|
if (data != null) {
|
|||
|
json = JSON.toJSONString(data);
|
|||
|
}
|
|||
|
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
|
|||
|
} else {
|
|||
|
FormBody.Builder formBody = new FormBody.Builder();
|
|||
|
if (data != null) {
|
|||
|
data.forEach((key,value) ->{
|
|||
|
formBody.add(key,String.valueOf(value));
|
|||
|
});
|
|||
|
}
|
|||
|
requestBody = formBody.build();
|
|||
|
}
|
|||
|
request = new Request.Builder().post(requestBody).url(url);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 初始化post方法
|
|||
|
*
|
|||
|
* @param isJsonPut true等于json的方式提交数据,类似postman里post方法的raw
|
|||
|
* false等于普通的表单提交
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils put(boolean isJsonPut) {
|
|||
|
RequestBody requestBody;
|
|||
|
if (isJsonPut) {
|
|||
|
String json = "";
|
|||
|
if (paramMap != null) {
|
|||
|
json = JSON.toJSONString(paramMap);
|
|||
|
}
|
|||
|
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
|
|||
|
} else {
|
|||
|
FormBody.Builder formBody = new FormBody.Builder();
|
|||
|
if (paramMap != null) {
|
|||
|
paramMap.forEach((key,value) ->{
|
|||
|
formBody.add(key,String.valueOf(value));
|
|||
|
});
|
|||
|
}
|
|||
|
requestBody = formBody.build();
|
|||
|
}
|
|||
|
request = new Request.Builder().put(requestBody).url(url);
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 初始化post方法
|
|||
|
*
|
|||
|
* @param isJsonPut true等于json的方式提交数据,类似postman里post方法的raw
|
|||
|
* false等于普通的表单提交
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public OkHttpUtils put(Map<String,Object> data,boolean isJsonPut) {
|
|||
|
RequestBody requestBody;
|
|||
|
if (isJsonPut) {
|
|||
|
String json = "";
|
|||
|
if (data != null) {
|
|||
|
json = JSON.toJSONString(data);
|
|||
|
}
|
|||
|
requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
|
|||
|
} else {
|
|||
|
FormBody.Builder formBody = new FormBody.Builder();
|
|||
|
if (data != null) {
|
|||
|
data.forEach((key,value) ->{
|
|||
|
formBody.add(key,String.valueOf(value));
|
|||
|
});
|
|||
|
}
|
|||
|
requestBody = formBody.build();
|
|||
|
}
|
|||
|
request = new Request.Builder().put(requestBody).url(url);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 同步请求
|
|||
|
*
|
|||
|
* @return
|
|||
|
*/
|
|||
|
public String sync() {
|
|||
|
setHeader(request);
|
|||
|
try {
|
|||
|
Response response = okHttpClient.newCall(request.build()).execute();
|
|||
|
assert response.body() != null;
|
|||
|
return response.body().string();
|
|||
|
} catch (IOException e) {
|
|||
|
e.printStackTrace();
|
|||
|
return "请求失败:" + e.getMessage();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 异步请求,有返回值
|
|||
|
*/
|
|||
|
public String async() {
|
|||
|
StringBuilder buffer = new StringBuilder("");
|
|||
|
setHeader(request);
|
|||
|
okHttpClient.newCall(request.build()).enqueue(new Callback() {
|
|||
|
@Override
|
|||
|
public void onFailure(Call call, IOException e) {
|
|||
|
buffer.append("请求出错:").append(e.getMessage());
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public 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();
|
|||
|
}
|
|||
|
return buffer.toString();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 异步请求,带有接口回调
|
|||
|
*
|
|||
|
* @param callBack
|
|||
|
*/
|
|||
|
public void async(ICallBack callBack) {
|
|||
|
setHeader(request);
|
|||
|
okHttpClient.newCall(request.build()).enqueue(new Callback() {
|
|||
|
@Override
|
|||
|
public void onFailure(Call call, IOException e) {
|
|||
|
callBack.onFailure(call, e.getMessage());
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void onResponse(Call call, Response response) throws IOException {
|
|||
|
assert response.body() != null;
|
|||
|
callBack.onSuccessful(call, response.body().string());
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 为request添加请求头
|
|||
|
*
|
|||
|
* @param 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请求的证书跳过
|
|||
|
*
|
|||
|
* @return
|
|||
|
*/
|
|||
|
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() {
|
|||
|
@Override
|
|||
|
public void checkClientTrusted(X509Certificate[] chain, String authType) {
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) {
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public X509Certificate[] getAcceptedIssuers() {
|
|||
|
return new X509Certificate[]{};
|
|||
|
}
|
|||
|
}};
|
|||
|
}
|
|||
|
/**
|
|||
|
* 自定义一个接口回调
|
|||
|
*/
|
|||
|
public interface ICallBack {
|
|||
|
|
|||
|
void onSuccessful(Call call, String data);
|
|||
|
|
|||
|
void onFailure(Call call, String errorMsg);
|
|||
|
|
|||
|
}
|
|||
|
}
|