package com.doumee.keyCabinet.utils;
|
|
import java.io.BufferedReader;
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.io.OutputStream;
|
import java.security.SecureRandom;
|
import java.security.cert.CertificateException;
|
import java.security.cert.X509Certificate;
|
import java.util.Iterator;
|
import java.util.Map;
|
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.TimeUnit;
|
|
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLSession;
|
import javax.net.ssl.SSLSocketFactory;
|
import javax.net.ssl.TrustManager;
|
import javax.net.ssl.X509TrustManager;
|
|
import okhttp3.Call;
|
import okhttp3.Callback;
|
import okhttp3.FormBody;
|
import okhttp3.Headers;
|
import okhttp3.MediaType;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.RequestBody;
|
import okhttp3.Response;
|
import okhttp3.ResponseBody;
|
|
|
/**
|
* @Description
|
* @ClassName OkHttpClientUtil
|
* @Author
|
* @Copyright
|
*/
|
public class OkHttpClientUtil {
|
|
//private static Logger logger = LoggerFactory.getLogger(OkHttpClientUtil.class);
|
//private static String JSON = "application/json; charset=utf-8";
|
private static String MEDIA_TYPE_JSON= "application/x-www-form-urlencoded; charset=utf-8";
|
/**使用volatile双重校验锁**/
|
private static volatile Semaphore semaphore = null;
|
private static volatile OkHttpClient okHttpClient = null;
|
|
/**建立单例模式*/
|
public static Semaphore getSemaphoreInstance(){
|
//只能0个线程同时访问
|
synchronized (OkHttpClientUtil.class) {
|
if (semaphore == null) {
|
semaphore = new Semaphore(0);
|
}
|
}
|
return semaphore;
|
}
|
|
|
/**建立单例模式*/
|
public static OkHttpClient getInstance(){
|
synchronized (OkHttpClientUtil.class) {
|
if (okHttpClient == null) {
|
//这里是以毫秒为单位,1000 毫秒 = 1秒
|
okHttpClient = new OkHttpClient().newBuilder()
|
.connectTimeout(5000, TimeUnit.SECONDS)// 设置超时时间
|
.readTimeout(5000, TimeUnit.SECONDS)// 设置读取超时时间
|
.writeTimeout(5000, TimeUnit.SECONDS)// 设置写入超时时间
|
.build();
|
}
|
}
|
return okHttpClient;
|
}
|
|
|
/**
|
* @Description 求在子线程发起网络请求
|
* @param url 请求url地址
|
* @param params 请求body参数
|
* @param okHttpClientCall 回调接口
|
* @throws IOException 参数
|
* @return void 返回类型
|
*/
|
public static void createAsycHttpGet(String url,Map<String,Object> params,String contentType,final IOkHttpClientCallBack okHttpClientCall) {
|
// 创建请求对象
|
Call call = createCall(url, params);
|
|
//发起异步的请求
|
call.enqueue(new Callback() {
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
if (response!=null && response.isSuccessful()) {
|
String string = response.body().string();
|
okHttpClientCall.onSuccessful(string);
|
}
|
}
|
@Override
|
public void onFailure(Call call, IOException e) {
|
String errorLog = getCurrentClassName()+"#createHttpGet,请求异常,异常信息为:"+e.getMessage();
|
//logger.error("@see "+errorLog);
|
}
|
});
|
}
|
|
/**
|
* @Description 求在子线程发起网络请求
|
* @param url 请求url地址
|
* @param params 请求body参数
|
* @throws IOException 参数
|
* @return void 返回类型
|
*/
|
public static String createAsycHttpGet(String url,Map<String,Object> params,String contentType) {
|
final StringBuilder buffer = new StringBuilder("");
|
try {
|
// 创建请求对象
|
Call call = createCall(url, params);
|
|
//发起异步的请求
|
call.enqueue(new Callback() {
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
|
if (response!=null && response.isSuccessful()) {
|
String string = response.body().string();
|
buffer.append(string);
|
getSemaphoreInstance().release();
|
}
|
}
|
@Override
|
public void onFailure(Call call, IOException e) {
|
String errorLog = getCurrentClassName()+"#createHttpGet,请求异常,异常信息为:"+e.getMessage();
|
//logger.error("@see "+errorLog);
|
}
|
});
|
getSemaphoreInstance().acquire();//获取许可
|
return buffer.toString();
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
return buffer.toString();
|
}
|
|
/**
|
* @Description 求在子线程发起网络请求
|
* @param url 请求url地址
|
* @param params 请求body参数
|
* @throws IOException 参数
|
* @return void 返回类型
|
*/
|
public static String createHttpGet(String url,Map<String,Object> params,String contentType) {
|
try {
|
// 创建请求对象
|
Call call = createCall(url, params);
|
|
Response response = call.execute();
|
if (response!=null && response.isSuccessful() && response.body().string()!=null) {
|
//Collection<String> readLines = IOUtil.readLines(byteStream);
|
//System.out.println(readLines);
|
return convertToString(response.body().byteStream());
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return "";
|
}
|
|
|
/**
|
* @Description convertStreamToString
|
* @param is
|
* @return 参数
|
* @return String 返回类型
|
* @throws
|
*/
|
public static String convertToString(InputStream is) {
|
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
StringBuilder buffer = new StringBuilder();
|
String line = null;
|
try {
|
while ((line = reader.readLine()) != null) {
|
buffer.append(line + "\r");
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
} finally {
|
try {
|
is.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
return buffer.toString();
|
}
|
|
/**
|
* @Description convertStr
|
* @param is
|
* @return
|
* @throws IOException 参数
|
* @return String 返回类型
|
* @throws
|
*/
|
public static String convertStr(InputStream is) throws IOException {
|
OutputStream baos = new ByteArrayOutputStream();
|
int i = -1;
|
while ((i = is.read()) != -1) {
|
baos.write(i);
|
}
|
return baos.toString();
|
}
|
/**
|
* @Description 创建异步表单Body参数的post请求处理
|
* @param url 请求链接
|
* @param params 请求表单body参数
|
* @param okHttpClientCall 参数 回调接口
|
* @return void 返回类型
|
*/
|
public static void createPostByAsynWithForm(String url,Map<String,Object> params,final IOkHttpClientCallBack okHttpClientCall) {
|
FormBody.Builder builder = new FormBody.Builder();
|
for (String key : params.keySet()) {
|
builder.add(key, params.get(key).toString());
|
}
|
RequestBody formBody = builder.build();
|
//logger.info("@see"+getCurrentClassName()+"请求url"+url+",请求参数:"+formBody);
|
|
Request request = new Request.Builder().url(url).post(formBody).build();
|
// 创建请求对象
|
Call call = getInstance().newCall(request);
|
//发起异步的请求
|
call.enqueue(new Callback() {
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
|
if (response!=null && response.isSuccessful()) {
|
String string = response.body().string();
|
okHttpClientCall.onSuccessful(string);
|
}
|
}
|
|
@Override
|
public void onFailure(Call call, IOException e) {
|
String errorLog = getCurrentClassName()+"#createPostByAsynWithForm,请求异常,异常信息为:"+e.getMessage();
|
//okHttpClientCall.onFailure(errorLog);
|
//logger.error("@see "+errorLog);
|
}
|
});
|
}
|
|
|
/**
|
* @Description 创建异步表单Body参数的post请求处理
|
* @param url 请求链接
|
* @param params 请求表单body参数
|
* @return
|
* @return void 返回类型
|
*/
|
public static String createPostByAsynWithForm(String url,Map<String,Object> params) {
|
final StringBuilder buffer = new StringBuilder("");
|
try {
|
FormBody.Builder builder = new FormBody.Builder();
|
for (String key : params.keySet()) {
|
builder.add(key, params.get(key).toString());
|
}
|
RequestBody formBody = builder.build();
|
//logger.info("@see"+getCurrentClassName()+"请求url"+url+",请求参数:"+formBody);
|
|
Request request = new Request.Builder().url(url).post(formBody).build();
|
// 创建请求对象
|
Call call = getInstance().newCall(request);
|
//发起异步的请求
|
call.enqueue(new Callback() {
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
|
if (response!=null && response.isSuccessful()) {
|
String string = response.body().string();
|
buffer.append(string);
|
getSemaphoreInstance().release();
|
}
|
}
|
|
@Override
|
public void onFailure(Call call, IOException e) {
|
String errorLog = getCurrentClassName()+"#createPostByAsynWithForm,请求异常,异常信息为:"+e.getMessage();
|
//logger.error("@see "+errorLog);
|
}
|
});
|
getSemaphoreInstance().acquire();
|
return buffer.toString();
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
return buffer.toString();
|
}
|
|
|
|
/**
|
* okHttp createCall
|
* @param url 接口地址
|
* @param params 请求参数
|
*/
|
private static Call createCall(String url, Map<String, Object> params) {
|
//补全请求地址,【%s?%s或者%s/%s的使用】第一个%s代表第一个参数,第二个?代表是请求地址的?后面%s代表是组装戳参数,如:
|
//http://localhost:8080/api/test.do?userId=1212&deviceInfo=PC
|
String requestUrl = String.format("%s?%s", url, concatParams(params).toString());
|
//创建一个请求
|
Request request = new Request.Builder().url(requestUrl).build();
|
return getInstance().newCall(request);
|
}
|
|
|
/**
|
* @param url
|
* @param reqMap
|
* @param contentType
|
* @return 参数
|
* @return String 返回类型
|
*/
|
public static String createHttpPost(String url,Map<String,Object> reqMap,String contentType) {
|
try {
|
RequestBody body = createRequestBody(contentType, reqMap);
|
//logger.info("@see"+getCurrentClassName()+"#createHttpPost,请求url"+url+",请求参数:"+body.toString());
|
final Request request = new Request.Builder().url(url).post(body).build();
|
// 创建请求对象
|
final Call call = getInstance().newCall(request);
|
Response response = call.execute();
|
if (response!=null && response.isSuccessful()) {
|
return convertStr(response.body().byteStream());
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return "";
|
|
}
|
|
/**
|
* @param url 参数
|
* @return void 返回类型
|
*/
|
public static String createAsycHttpPost(String url,Map<String,Object> reqMap,String contentType) {
|
final StringBuilder buffer = new StringBuilder("");
|
try {
|
final RequestBody body = createRequestBody(contentType, reqMap);
|
|
//logger.info("@see"+getCurrentClassName()+"#createHttpPost,请求url"+url+",请求参数:"+body.toString());
|
final Request request = new Request.Builder().url(url).post(body).build();
|
// 创建请求对象
|
final Call call = getInstance().newCall(request);
|
|
// 发起请求
|
call.enqueue(new Callback() {
|
@Override
|
public void onFailure(Call call, IOException e) {
|
String errorLog = getCurrentClassName()+"#createHttpPost,请求异常,异常信息为:"+e.getMessage();
|
//logger.error("@see "+errorLog);
|
}
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
if (response!=null && response.isSuccessful()) {
|
if(response.body().string()!=null){
|
String string = response.body().string();
|
buffer.append(string);
|
getSemaphoreInstance().release();//释放
|
}
|
}
|
}
|
});
|
getSemaphoreInstance().acquire();//接受
|
return buffer.toString();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return buffer.toString();
|
}
|
|
/**
|
* @param url 参数
|
* @return void 返回类型
|
*/
|
public static void createAsycHttpPost(String url,String postjson,Map<String,String> headMap,final IOkHttpClientCallBack okHttpClientCall) {
|
Headers setHeaders = SetHeaders(headMap);
|
MediaType mediaType = MediaType.parse("application/json;charset=UTF-8");
|
final RequestBody requestBody = RequestBody.create(mediaType, postjson);;
|
final Request request = new Request.Builder().url(url).headers(setHeaders).post(requestBody).build();
|
// 创建请求对象
|
final Call call = getInstance().newCall(request);
|
// 发起请求
|
call.enqueue(new Callback() {
|
@Override
|
public void onFailure(Call call, IOException e) {
|
String errorLog = getCurrentClassName()+"#createHttpPost,请求异常,异常信息为:"+e.getMessage();
|
//logger.error("@see "+errorLog);
|
}
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
if (response!=null && response.isSuccessful()) {
|
if(response.body()!=null&&response.body().string()!=null){
|
Object obj = response.body().string();
|
String retBody = response.body().string();
|
okHttpClientCall.onSuccessful(retBody);
|
}
|
}
|
}
|
});
|
}
|
|
public static void asynPost(String url,String postjson,Map<String,String> headMap,final IOkHttpClientCallBack okHttpClientCall) {
|
Headers setHeaders = SetHeaders(headMap);
|
MediaType mediaType = MediaType.parse("application/json;charset=UTF-8");
|
final RequestBody requestBody = RequestBody.create(mediaType, postjson);
|
final Request request = new Request.Builder()
|
.url(url)
|
.headers(setHeaders)
|
.post(requestBody)
|
.build();
|
final Call client = getInstance().newCall(request);
|
client.enqueue(new Callback() {
|
@Override
|
public void onFailure(Call call, IOException e) {
|
okHttpClientCall.onError();
|
}
|
|
@Override
|
public void onResponse(Call call, Response response) throws IOException {
|
ResponseBody body = response.body();
|
if (body != null) {
|
//LogUtils.d("asynPost==>", body.string());
|
okHttpClientCall.onSuccessful(body.string());
|
}else {
|
okHttpClientCall.onError();
|
}
|
}
|
});
|
}
|
|
/**
|
*
|
* @param contentType 请求头header属性
|
* @param params 请求参数
|
* @return 参数
|
* @return RequestBody 返回类型
|
*/
|
private static RequestBody createRequestBody(String contentType,Map<String,Object> params){
|
MediaType type = MediaType.parse(contentType);
|
String paramStrs = concatParams(params).toString();
|
return RequestBody.create(type, paramStrs);
|
}
|
|
|
|
/**
|
* @param params
|
* @return 参数
|
* @return StringBuilder 返回类型
|
*/
|
private static StringBuilder concatParams(Map<String, Object> params) {
|
StringBuilder builder = new StringBuilder("");//请求参数为空给一个默认值空字符串
|
//判断是空
|
if (params.size()>0) {
|
int i = 0;
|
for (String key : params.keySet()) {
|
Object value = params.get(key);
|
builder.append(i != 0 ? "&" : "");
|
builder.append(key + "=" + value);
|
i++;
|
}
|
}
|
return builder;
|
}
|
|
|
/**
|
* @param url
|
* @param reqMap
|
* @param contentType 参数
|
* @return void 返回类型
|
* @throws
|
*/
|
public static String createHttpsPost(String url,Map<String,Object> reqMap,String contentType) {
|
final StringBuilder buffer = new StringBuilder("");
|
/**忽略SSL协议证书*/
|
|
OkHttpClient build = new OkHttpClient.Builder().sslSocketFactory(createSSLSocketFactory()).hostnameVerifier(new TrustAllHostnameVerifier()).build();
|
|
final RequestBody body = createRequestBody(contentType, reqMap);
|
|
final Request request = new Request.Builder().url(url).post(body).build();
|
final Call call = build.newCall(request);
|
call.enqueue(new Callback() {
|
@Override
|
public void onFailure(Call call, IOException e) {
|
}
|
@Override
|
public void onResponse(Call call, Response response) throws IOException
|
{
|
String res = response.body().string();
|
buffer.append(res);
|
getSemaphoreInstance().release();//释放
|
}
|
});
|
|
try {
|
getSemaphoreInstance().acquire();
|
} catch (InterruptedException e1) {
|
e1.printStackTrace();
|
}
|
return buffer.toString();
|
}
|
|
/**
|
* @param url
|
* @return void 返回类型
|
* @throws
|
*/
|
public static String createHttpsPostByjson(String url,String postjson, Map<String, String> headMap) {
|
final StringBuilder buffer = new StringBuilder("");
|
/**忽略SSL协议证书*/
|
Headers setHeaders = SetHeaders(headMap);
|
OkHttpClient build = new OkHttpClient.Builder().sslSocketFactory(createSSLSocketFactory()).hostnameVerifier(new TrustAllHostnameVerifier()).build();
|
MediaType mediaType = MediaType.parse("application/json;charset=UTF-8");
|
final RequestBody requestBody = RequestBody.create(mediaType, postjson);;
|
|
final Request request = new Request.Builder().url(url).headers(setHeaders).post(requestBody).build();
|
final Call call = build.newCall(request);
|
call.enqueue(new Callback() {
|
@Override
|
public void onFailure(Call call, IOException e) {
|
}
|
@Override
|
public void onResponse(Call call, Response response) throws IOException
|
{
|
String res = response.body().string();
|
buffer.append(res);
|
getSemaphoreInstance().release();//释放
|
}
|
});
|
|
try {
|
getSemaphoreInstance().acquire();
|
} catch (InterruptedException e1) {
|
e1.printStackTrace();
|
}
|
return buffer.toString();
|
}
|
|
public static Headers SetHeaders(Map<String, String> headersParams) {
|
Headers headers = null;
|
okhttp3.Headers.Builder headersbuilder = new okhttp3.Headers.Builder();
|
if (headersParams.size()>0) {
|
Iterator<String> iterator = headersParams.keySet().iterator();
|
String key = "";
|
while (iterator.hasNext()) {
|
key = iterator.next().toString();
|
headersbuilder.add(key, headersParams.get(key));
|
}
|
}
|
headers = headersbuilder.build();
|
return headers;
|
}
|
|
/**
|
* @Author liangjl
|
* @Copyright (c) All Rights Reserved, 2018.
|
*/
|
private static class TrustAllCerts implements X509TrustManager {
|
@Override
|
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
|
}
|
|
@Override
|
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
|
}
|
|
@Override
|
public X509Certificate[] getAcceptedIssuers() {
|
return new X509Certificate[0];
|
}
|
}
|
|
/**
|
* @Description 验证所有主机
|
* @ClassName TrustAllHostnameVerifier
|
* @Copyright (c) All Rights Reserved, 2018.
|
*/
|
private static class TrustAllHostnameVerifier implements HostnameVerifier {
|
@Override
|
public boolean verify(String hostname, SSLSession session) {
|
return true;
|
}
|
}
|
|
/**
|
* @Description createSSLSocketFactory
|
* @return 参数
|
* @return SSLSocketFactory 返回类型
|
* @throws
|
*/
|
private static SSLSocketFactory createSSLSocketFactory() {
|
SSLSocketFactory ssfFactory = null;
|
try {
|
SSLContext sc = SSLContext.getInstance("TLS");
|
sc.init(null, new TrustManager[] { new TrustAllCerts() }, new SecureRandom());
|
ssfFactory = sc.getSocketFactory();
|
} catch (Exception e) {
|
}
|
return ssfFactory;
|
}
|
|
/**
|
*
|
* @Description 获取当前类名包含有包名路径
|
* @param @return 参数
|
* @return String 返回类型
|
* @throws
|
*/
|
public static String getCurrentClassName(){
|
return OkHttpClientUtil.class.getName();
|
}
|
|
|
/**
|
* @Description 定义一个回调成功的接口.
|
* @ClassName IOkHttpClientCallBack
|
* @Copyright (c) All Rights Reserved, 2018.
|
*/
|
public interface IOkHttpClientCallBack {
|
|
void onSuccessful(String retBody);
|
|
void onError();
|
}
|
}
|