package com.team.zhuoke.net.http;
import android.content.Context;
import com.team.zhuoke.net.config.NetWorkConfiguration;
import com.team.zhuoke.net.cookie.SimpleCookieJar;
import com.team.zhuoke.net.interceptor.LogInterceptor;
import com.team.zhuoke.net.request.RetrofitClient;
import com.team.zhuoke.utils.L;
import com.team.zhuoke.utils.NetworkUtil;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.TimeUnit;
import okhttp3.CacheControl;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述: 对OkHttpClient进行配置
* 备注消息:
* 修改时间:2016/11/18 下午2:12
**/
public class HttpUtils {
public static final String TAG = "HttpUtils";
// 获得HttpUtils实例
private static HttpUtils mInstance;
// OkHttpClient对象
private OkHttpClient mOkHttpClient;
private static NetWorkConfiguration configuration;
private Context context;
/**
* 是否加载本地缓存数据
* 默认为TRUE
*/
private boolean isLoadDiskCache=true;
/**
* ---> 针对无网络情况
* 是否加载本地缓存数据
* @param isCache true为加载 false不进行加载
* @return
*/
public HttpUtils setLoadDiskCache(boolean isCache) {
this.isLoadDiskCache = isCache;
return this;
}
/**
* ---> 针对有网络情况
* 是否加载内存缓存数据
* 默认为False
*/
private boolean isLoadMemoryCache=false;
/**
* 是否加载内存缓存数据
* @param isCache true为加载 false不进行加载
* @return
*/
public HttpUtils setLoadMemoryCache(boolean isCache)
{
this.isLoadMemoryCache=isCache;
return this;
}
public HttpUtils(Context context)
{
//创建默认 okHttpClient对象
this.context=context;
/**进行默认配置
* 未配置configuration ,
*
*/
if(configuration==null)
{
configuration=new NetWorkConfiguration(context);
}
if(configuration.getIsCache())
{
mOkHttpClient=new OkHttpClient.Builder()
// 网络缓存拦截器
.addInterceptor(interceptor)
.addNetworkInterceptor(interceptor)
// 自定义网络Log显示
.addInterceptor(new LogInterceptor())
.cache(configuration.getDiskCache())
.connectTimeout(configuration.getConnectTimeOut(), TimeUnit.SECONDS)
.connectionPool(configuration.getConnectionPool())
.retryOnConnectionFailure(true)
.build();
}
else
{
mOkHttpClient=new OkHttpClient.Builder()
.addInterceptor(new LogInterceptor())
.connectTimeout(configuration.getConnectTimeOut(), TimeUnit.SECONDS)
.connectionPool(configuration.getConnectionPool())
.retryOnConnectionFailure(true)
.build();
}
/**
*
* 判断是否在AppLication中配置Https证书
*
*/
if(configuration.getCertificates()!=null)
{
mOkHttpClient = getOkHttpClient().newBuilder()
.sslSocketFactory(HttpsUtils.getSslSocketFactory(configuration.getCertificates(), null, null))
.build();
}
}
/**
* 设置网络配置参数
* @param configuration
*/
public static void setConFiguration(NetWorkConfiguration configuration)
{
if(configuration == null) {
throw new IllegalArgumentException("ImageLoader configuration can not be initialized with null");
} else {
if(HttpUtils.configuration == null) {
L.d("Initialize NetWorkConfiguration with configuration");
HttpUtils.configuration = configuration;
} else {
L.e("Try to initialize NetWorkConfiguration which had already been initialized before. To re-init NetWorkConfiguration with new configuration ");
}
}
if(configuration!=null) {
L.i("ConFiguration" + configuration.toString());
}
}
public RetrofitClient getRetofitClinet()
{
L.i("configuration:"+configuration.toString());
return new RetrofitClient(configuration.getBaseUrl(),mOkHttpClient);
}
/**
* 设置HTTPS客户端带证书访问
* @param certificates 本地证书
*/
public HttpUtils setCertificates(InputStream... certificates)
{
mOkHttpClient = getOkHttpClient().newBuilder()
.sslSocketFactory(HttpsUtils.getSslSocketFactory(certificates, null, null))
.build();
return this;
}
/**
* 设置是否打印网络日志
* @param falg
*/
public HttpUtils setDBugLog(boolean falg)
{
if(falg)
{
mOkHttpClient=getOkHttpClient().newBuilder()
.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
}
return this;
}
/**
* 设置Coolie
* @return
*/
public HttpUtils addCookie()
{
mOkHttpClient=getOkHttpClient().newBuilder()
.cookieJar(new SimpleCookieJar())
.build();
return this;
}
/**
* 获得OkHttpClient实例
* @return
*/
public OkHttpClient getOkHttpClient()
{
return mOkHttpClient;
}
/**
* 网络拦截器
* 进行网络操作的时候进行拦截
*/
final Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
/**
* 断网后是否加载本地缓存数据
*
*/
if (!NetworkUtil.isNetworkAvailable(configuration.context)&&isLoadDiskCache) {
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
// 加载内存缓存数据
else if(isLoadMemoryCache)
{
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
/**
* 加载网络数据
*/
else
{
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_NETWORK)
.build();
}
Response response = chain.proceed(request);
// 有网进行内存缓存数据
if (NetworkUtil.isNetworkAvailable(configuration.context)&&configuration.getIsMemoryCache()) {
response.newBuilder()
.header("Cache-Control", "public, max-age=" + configuration.getmemoryCacheTime())
.removeHeader("Pragma")
.build();
} else {
// 进行本地缓存数据
if(configuration.getIsDiskCache()) {
response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + configuration.getDiskCacheTime())
.removeHeader("Pragma")
.build();
}
}
return response;
}
};
/**
* 获取请求网络实例
* @return
*/
public static HttpUtils getInstance(Context context)
{
if (mInstance == null)
{
synchronized (HttpUtils.class)
{
if (mInstance == null)
{
mInstance = new HttpUtils(context);
}
}
}
return mInstance;
}
}