【述】为什么要封装?不封装=>初入菜鸟;封装=>渐入佳境
【目录】
【Step 1】commonOkHttpClient的封装
package com.gzyuehong.yuehong.Utils.okhttp;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
/**
* @author actionchen
* @function 请求的发送;请求参数的配置;https支持
*/
public class CommonOkHttpClient {
private static final int TIME_OUT=30;//超时时间
private static OkHttpClient mOkHttpClient;
//配置mOkHttpClient参数
static {
//创建client对象的构建者
OkHttpClient.Builder okHttpBulder=new OkHttpClient.Builder();
//为构建者填充超时时间
okHttpBulder.connectTimeout(TIME_OUT, TimeUnit.SECONDS);
okHttpBulder.readTimeout(TIME_OUT,TimeUnit.SECONDS);
okHttpBulder.writeTimeout(TIME_OUT,TimeUnit.SECONDS);
okHttpBulder.followRedirects(true);
//https支持
okHttpBulder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
okHttpBulder.sslSocketFactory(HttpsUtils.initSSLSocketFactory(), HttpsUtils.initTrustManager());
mOkHttpClient = okHttpBulder.build();
}
/**
*发送具体的Https/http请求
* @param request
* @param commonCallback
* @return
*/
public static Call sendRequest(Request request, Callback commonCallback){
Call call=mOkHttpClient.newCall(request);
call.enqueue(commonCallback);
return call;
};
}
【Step 2】commonRequest的封装
package com.gzyuehong.yuehong.Utils.okhttp;
import java.io.File;
import java.util.Map;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* @author vision
* @function build the request
*/
public class CommonRequest {
/**
* create the key-value Request
*
* @param url
* @param params
* @return
*/
public static Request createPostRequest(String url, RequestParams params) {
return createPostRequest(url, params, null);
}
/**可以带请求头的Post请求
* @param url
* @param params
* @param headers
* @return
*/
public static Request createPostRequest(String url, RequestParams params, RequestParams headers) {
FormBody.Builder mFormBodyBuild = new FormBody.Builder();
if (params != null) {
for (Map.Entry entry : params.urlParams.entrySet()) {
mFormBodyBuild.add(entry.getKey(), entry.getValue());
}
}
//添加请求头
Headers.Builder mHeaderBuild = new Headers.Builder();
if (headers != null) {
for (Map.Entry entry : headers.urlParams.entrySet()) {
mHeaderBuild.add(entry.getKey(), entry.getValue());
}
}
FormBody mFormBody = mFormBodyBuild.build();
Headers mHeader = mHeaderBuild.build();
Request request = new Request.Builder().url(url).
post(mFormBody).
headers(mHeader)
.build();
return request;
}
/**
* ressemble the params to the url
*
* @param url
* @param params
* @return
*/
public static Request createGetRequest(String url, RequestParams params) {
return createGetRequest(url, params, null);
}
/**
* 可以带请求头的Get请求
* @param url
* @param params
* @param headers
* @return
*/
public static Request createGetRequest(String url, RequestParams params, RequestParams headers) {
StringBuilder urlBuilder = new StringBuilder(url).append("?");
if (params != null) {
for (Map.Entry entry : params.urlParams.entrySet()) {
urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
//添加请求头
Headers.Builder mHeaderBuild = new Headers.Builder();
if (headers != null) {
for (Map.Entry entry : headers.urlParams.entrySet()) {
mHeaderBuild.add(entry.getKey(), entry.getValue());
}
}
Headers mHeader = mHeaderBuild.build();
return new Request.Builder().
url(urlBuilder.substring(0, urlBuilder.length() - 1))
.get()
.headers(mHeader)
.build();
}
/**
* @param url
* @param params
* @return
*/
public static Request createMonitorRequest(String url, RequestParams params) {
StringBuilder urlBuilder = new StringBuilder(url).append("&");
if (params != null && params.hasParams()) {
for (Map.Entry entry : params.urlParams.entrySet()) {
urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
return new Request.Builder().url(urlBuilder.substring(0, urlBuilder.length() - 1)).get().build();
}
/**
* 文件上传请求
*
* @return
*/
private static final MediaType FILE_TYPE = MediaType.parse("application/octet-stream");
public static Request createMultiPostRequest(String url, RequestParams params) {
MultipartBody.Builder requestBody = new MultipartBody.Builder();
requestBody.setType(MultipartBody.FORM);
if (params != null) {
for (Map.Entry entry : params.fileParams.entrySet()) {
if (entry.getValue() instanceof File) {
requestBody.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""),
RequestBody.create(FILE_TYPE, (File) entry.getValue()));
} else if (entry.getValue() instanceof String) {
requestBody.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""),
RequestBody.create(null, (String) entry.getValue()));
}
}
}
return new Request.Builder().url(url).post(requestBody.build()).build();
}
}
【Step 3】commonJsonCallback的封装,可以更深层的封装,在handleResponse解析服务器返回数据的状态码,我这--手贱--导致服务器反馈数据不统一,所以直接返回obj。
package com.gzyuehong.yuehong.Utils.okhttp.response;
import android.os.Handler;
import android.os.Looper;
import com.gzyuehong.yuehong.Utils.okhttp.exception.OkHttpException;
import com.gzyuehong.yuehong.Utils.okhttp.listener.DisposeDataHandle;
import com.gzyuehong.yuehong.Utils.okhttp.listener.DisposeDataListener;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
/**
* @author vision
* @function 专门处理JSON的回调
*/
public class CommonJsonCallback implements Callback {
/**
* the logic layer exception, may alter in different app
*/
protected final String RESULT_CODE = "ecode"; // 有返回则对于http请求来说是成功的,但还有可能是业务逻辑上的错误
protected final int RESULT_CODE_VALUE = 0;
protected final String ERROR_MSG = "emsg";
protected final String EMPTY_MSG = "";
protected final String COOKIE_STORE = "Set-Cookie"; // decide the server it
// can has the value of
// set-cookie2
/**
* the java layer exception, do not same to the logic error
*/
protected final int NETWORK_ERROR = -1; // the network relative error
protected final int JSON_ERROR = -2; // the JSON relative error
protected final int OTHER_ERROR = -3; // the unknow error
/**
* 将其它线程的数据转发到UI线程
*/
private Handler mDeliveryHandler;
private DisposeDataListener mListener;
private Class> mClass;
public CommonJsonCallback(DisposeDataHandle handle) {
this.mListener = handle.mListener;
this.mClass = handle.mClass;
this.mDeliveryHandler = new Handler(Looper.getMainLooper());
}
@Override
public void onFailure(final Call call, final IOException ioexception) {
/**
* 此时还在非UI线程,因此要转发
*/
mDeliveryHandler.post(new Runnable() {
@Override
public void run() {
mListener.onFailure(new OkHttpException(NETWORK_ERROR, ioexception));
}
});
}
@Override
public void onResponse(final Call call, final Response response) throws IOException {
final String result = response.body().string();
mDeliveryHandler.post(new Runnable() {
@Override
public void run() {
handleResponse(result);
}
});
}
private void handleResponse(Object responseObj) {
if (responseObj == null || responseObj.toString().trim().equals("")) {
mListener.onFailure(new OkHttpException(NETWORK_ERROR, EMPTY_MSG));
return;
}
try {
/**
* 协议确定后看这里如何修改,还可以往下进行JSONobject解析,比如获取数据的状态码,但--手贱--服务器返回数据格式不统一,我这就直接返回obj
*/
JSONObject result = new JSONObject(responseObj.toString());
/*if (mClass == null) {*/
mListener.onSuccess(result);
/*} else {
*//*Object obj = ResponseEntityToModule.parseJsonObjectToModule(result, mClass);
if (obj != null) {
mListener.onSuccess(obj);
} else {
mListener.onFailure(new OkHttpException(JSON_ERROR, EMPTY_MSG));
}*//*
}*/
} catch (Exception e) {
mListener.onFailure(new OkHttpException(OTHER_ERROR, e.getMessage()));
e.printStackTrace();
}
}
}
【Step 4】DisposeDataHandle与DisposeDataListener信息处理回调
package com.gzyuehong.yuehong.Utils.okhttp.listener;
public class DisposeDataHandle {
public DisposeDataListener mListener=null;
public Class> mClass=null;
public DisposeDataHandle(DisposeDataListener Listener){
this.mListener=Listener;
}
public DisposeDataHandle(DisposeDataListener Listener,Class> clazz){
this.mClass=clazz;
this.mListener=Listener;
}
}
package com.gzyuehong.yuehong.Utils.okhttp.listener;
public interface DisposeDataListener {
public void onSuccess(Object responseObj);
public void onFailure(Object resonObj);
}
【Step 5】附加HttpsUtils.java,支持https
package com.gzyuehong.yuehong.Utils.okhttp;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
/**
* @author vision
* @function support the sslsocket
*/
public class HttpsUtils {
public static SSLSocketFactory getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password) {
try {
TrustManager[] trustManagers = prepareTrustManager(certificates);
KeyManager[] keyManagers = prepareKeyManager(bksFile, password);
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(keyManagers, new TrustManager[]
{new MyTrustManager(chooseTrustManager(trustManagers))}, new SecureRandom());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException e) {
throw new AssertionError(e);
} catch (KeyManagementException e) {
throw new AssertionError(e);
} catch (KeyStoreException e) {
throw new AssertionError(e);
}
}
private static TrustManager[] prepareTrustManager(InputStream... certificates) {
if (certificates == null || certificates.length <= 0)
return null;
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
int index = 0;
for (InputStream certificate : certificates) {
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
try {
if (certificate != null)
certificate.close();
} catch (IOException e)
{
}
}
TrustManagerFactory trustManagerFactory = null;
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
return trustManagers;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static KeyManager[] prepareKeyManager(InputStream bksFile, String password) {
try {
if (bksFile == null || password == null)
return null;
KeyStore clientKeyStore = KeyStore.getInstance("BKS");
clientKeyStore.load(bksFile, password.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(clientKeyStore, password.toCharArray());
return keyManagerFactory.getKeyManagers();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers) {
for (TrustManager trustManager : trustManagers) {
if (trustManager instanceof X509TrustManager) {
return (X509TrustManager) trustManager;
}
}
return null;
}
private static class MyTrustManager implements X509TrustManager {
private X509TrustManager defaultTrustManager;
private X509TrustManager localTrustManager;
public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException {
TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
var4.init((KeyStore) null);
defaultTrustManager = chooseTrustManager(var4.getTrustManagers());
this.localTrustManager = localTrustManager;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
try {
defaultTrustManager.checkServerTrusted(chain, authType);
} catch (CertificateException ce) {
localTrustManager.checkServerTrusted(chain, authType);
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
public static SSLSocketFactory initSSLSocketFactory() {
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("SSL");
X509TrustManager[] xTrustArray = new X509TrustManager[]
{initTrustManager()};
sslContext.init(null,
xTrustArray, new SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}
return sslContext.getSocketFactory();
}
public static X509TrustManager initTrustManager() {
X509TrustManager mTrustManager = new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
};
return mTrustManager;
}
}
【Step 6】使用
private void testQuest(){
RequestParams requestParams=new RequestParams();
//requestParams.put()
CommonOkHttpClient.sendRequest(CommonRequest.createPostRequest(Config.baseUrl+"",requestParams),
new CommonJsonCallback(new DisposeDataHandle(new DisposeDataListener() {
@Override
public void onSuccess(Object responseObj) {
}
@Override
public void onFailure(Object resonObj) {
}
})));
}