package com.github.bigexcalibur.herovideo.network; import com.facebook.stetho.okhttp3.StethoInterceptor; import com.github.bigexcalibur.herovideo.mvp.common.application.HeroVideoApp; import com.github.bigexcalibur.herovideo.network.api.BangumiService; import com.github.bigexcalibur.herovideo.network.api.BiliAVSearchService; import com.github.bigexcalibur.herovideo.network.api.BiliAVVideoService; import com.github.bigexcalibur.herovideo.network.api.BiliApiService; import com.github.bigexcalibur.herovideo.network.api.BiliAppService; import com.github.bigexcalibur.herovideo.network.api.LiveService; import com.github.bigexcalibur.herovideo.network.auxiliary.ApiConstants; import com.github.bigexcalibur.herovideo.util.CommonUtil; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.CacheControl; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by hcc on 16/8/4 21:18 * [email protected] * <p/> * Retrofit帮助类 */ public class RetrofitHelper { private static OkHttpClient mOkHttpClient; static { initOkHttpClient(); } public static OkHttpClient getOkHttpClient(){ return mOkHttpClient; } public static BiliAVSearchService getBiliAVSearchAPI() { return createApi(BiliAVSearchService.class, ApiConstants.RANK_BASE_URL); } public static BiliAVVideoService getBiliAVVideoAPI() { return createApi(BiliAVVideoService.class,ApiConstants.VIDEO_INTERFACE_URL); } // // public static BiliAVVideoService getBilibiliVideo() // { // return createApi(BiliAVVideoService.class, ApiConstants.RANK_BASE_URL); // } public static LiveService getLiveAPI() { return createApi(LiveService.class, ApiConstants.LIVE_BASE_URL); } public static BiliAppService getBiliAppAPI() { return createApi(BiliAppService.class, ApiConstants.APP_BASE_URL); } // public static BiliApiService getBiliAPI() { return createApi(BiliApiService.class, ApiConstants.API_BASE_URL); } // // public static BiliGoService getBiliGoAPI() // { // // return createApi(BiliGoService.class, ApiConstants.BILI_GO_BASE_URL); // } // // // public static RankService getRankAPI() // { // // return createApi(RankService.class, ApiConstants.RANK_BASE_URL); // } // // // public static UserService getUserAPI() // { // // return createApi(UserService.class, ApiConstants.USER_BASE_URL); // } // // // public static VipService getVipAPI() // { // // return createApi(VipService.class, ApiConstants.VIP_BASE_URL); // } // // public static BangumiService getBangumiAPI() { return createApi(BangumiService.class, ApiConstants.BANGUMI_BASE_URL); } // // // public static SearchService getSearchAPI() // { // // return createApi(SearchService.class, ApiConstants.SEARCH_BASE_URL); // } // // public static AccountService getAccountAPI() // { // // return createApi(AccountService.class, ApiConstants.ACCOUNT_BASE_URL); // } // // // public static Im9Service getIm9API() // { // // return createApi(Im9Service.class, ApiConstants.IM9_BASE_URL); // } // // /** * 根据传入的baseUrl,和api创建retrofit * * @param clazz * @param baseUrl * @param <T> * @return */ private static <T> T createApi(Class<T> clazz, String baseUrl) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(mOkHttpClient) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); return retrofit.create(clazz); } /** * 初始化OKHttpClient,设置缓存,设置超时时间,设置打印日志,设置UA拦截器 */ private static void initOkHttpClient() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); if (mOkHttpClient == null) { synchronized (RetrofitHelper.class) { if (mOkHttpClient == null) { //设置Http缓存 Cache cache = new Cache(new File(HeroVideoApp.getInstance() .getCacheDir(), "HttpCache"), 1024 * 1024 * 10); mOkHttpClient = new OkHttpClient.Builder() .cache(cache) .addInterceptor(interceptor) .addNetworkInterceptor(new CacheInterceptor()) .addNetworkInterceptor(new StethoInterceptor()) .retryOnConnectionFailure(true) .connectTimeout(30, TimeUnit.SECONDS) .writeTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) // .addInterceptor(new UserAgentInterceptor()) .build(); } } } } // /** // * 添加UA拦截器,B站请求API需要加上UA才能正常使用 // */ // private static class UserAgentInterceptor implements Interceptor // { // // @Override // public Response intercept(Chain chain) throws IOException // { // // Request originalRequest = chain.request(); // Request requestWithUserAgent = originalRequest.newBuilder() // .removeHeader("User-Agent") // .addHeader("User-Agent", ApiConstants.COMMON_UA_STR) // .build(); // return chain.proceed(requestWithUserAgent); // } // } /** * 为okhttp添加缓存,这里是考虑到服务器不支持缓存时,从而让okhttp支持缓存 */ private static class CacheInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { // 有网络时 设置缓存超时时间1个小时 int maxAge = 60 * 60; // 无网络时,设置超时为1天 int maxStale = 60 * 60 * 24; Request request = chain.request(); if (CommonUtil.isNetworkAvailable(HeroVideoApp.getInstance())) { //有网络时只从网络获取 request = request.newBuilder() .cacheControl(CacheControl.FORCE_NETWORK) .build(); } else { //无网络时只从缓存中读取 request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); if (CommonUtil.isNetworkAvailable(HeroVideoApp.getInstance())) { response = response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { response = response.newBuilder() .removeHeader("Pragma") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } return response; } } }