package com.codeest.geeknews.di.module; import com.codeest.geeknews.BuildConfig; import com.codeest.geeknews.app.Constants; import com.codeest.geeknews.di.qualifier.GankUrl; import com.codeest.geeknews.di.qualifier.GoldUrl; import com.codeest.geeknews.di.qualifier.MyUrl; import com.codeest.geeknews.di.qualifier.VtexUrl; import com.codeest.geeknews.di.qualifier.WechatUrl; import com.codeest.geeknews.di.qualifier.ZhihuUrl; import com.codeest.geeknews.model.http.api.GankApis; import com.codeest.geeknews.model.http.api.GoldApis; import com.codeest.geeknews.model.http.api.MyApis; import com.codeest.geeknews.model.http.api.VtexApis; import com.codeest.geeknews.model.http.api.WeChatApis; import com.codeest.geeknews.model.http.api.ZhihuApis; import com.codeest.geeknews.util.SystemUtil; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; 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.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by codeest on 2017/2/26. */ @Module public class HttpModule { @Singleton @Provides Retrofit.Builder provideRetrofitBuilder() { return new Retrofit.Builder(); } @Singleton @Provides OkHttpClient.Builder provideOkHttpBuilder() { return new OkHttpClient.Builder(); } @Singleton @Provides @ZhihuUrl Retrofit provideZhihuRetrofit(Retrofit.Builder builder, OkHttpClient client) { return createRetrofit(builder, client, ZhihuApis.HOST); } @Singleton @Provides @WechatUrl Retrofit provideWechatRetrofit(Retrofit.Builder builder, OkHttpClient client) { return createRetrofit(builder, client, WeChatApis.HOST); } @Singleton @Provides @GankUrl Retrofit provideGankRetrofit(Retrofit.Builder builder, OkHttpClient client) { return createRetrofit(builder, client, GankApis.HOST); } @Singleton @Provides @GoldUrl Retrofit provideGoldRetrofit(Retrofit.Builder builder, OkHttpClient client) { return createRetrofit(builder, client, GoldApis.HOST); } @Singleton @Provides @VtexUrl Retrofit provideVtexRetrofit(Retrofit.Builder builder, OkHttpClient client) { return createRetrofit(builder, client, VtexApis.HOST); } @Singleton @Provides @MyUrl Retrofit provideMyRetrofit(Retrofit.Builder builder, OkHttpClient client) { return createRetrofit(builder, client, MyApis.HOST); } @Singleton @Provides OkHttpClient provideClient(OkHttpClient.Builder builder) { if (BuildConfig.DEBUG) { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); builder.addInterceptor(loggingInterceptor); } File cacheFile = new File(Constants.PATH_CACHE); Cache cache = new Cache(cacheFile, 1024 * 1024 * 50); Interceptor cacheInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!SystemUtil.isNetworkConnected()) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); if (SystemUtil.isNetworkConnected()) { int maxAge = 0; // 有网络时, 不缓存, 最大保存时长为0 response.newBuilder() .header("Cache-Control", "public, max-age=" + maxAge) .removeHeader("Pragma") .build(); } else { // 无网络时,设置超时为4周 int maxStale = 60 * 60 * 24 * 28; response.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .removeHeader("Pragma") .build(); } return response; } }; // Interceptor apikey = new Interceptor() { // @Override // public Response intercept(Chain chain) throws IOException { // Request request = chain.request(); // request = request.newBuilder() // .addHeader("apikey",Constants.KEY_API) // .build(); // return chain.proceed(request); // } // } // 设置统一的请求头部参数 // builder.addInterceptor(apikey); //设置缓存 builder.addNetworkInterceptor(cacheInterceptor); builder.addInterceptor(cacheInterceptor); builder.cache(cache); //设置超时 builder.connectTimeout(10, TimeUnit.SECONDS); builder.readTimeout(20, TimeUnit.SECONDS); builder.writeTimeout(20, TimeUnit.SECONDS); //错误重连 builder.retryOnConnectionFailure(true); return builder.build(); } @Singleton @Provides ZhihuApis provideZhihuService(@ZhihuUrl Retrofit retrofit) { return retrofit.create(ZhihuApis.class); } @Singleton @Provides GankApis provideGankService(@GankUrl Retrofit retrofit) { return retrofit.create(GankApis.class); } @Singleton @Provides WeChatApis provideWechatService(@WechatUrl Retrofit retrofit) { return retrofit.create(WeChatApis.class); } @Singleton @Provides GoldApis provideGoldService(@GoldUrl Retrofit retrofit) { return retrofit.create(GoldApis.class); } @Singleton @Provides VtexApis provideVtexService(@VtexUrl Retrofit retrofit) { return retrofit.create(VtexApis.class); } @Singleton @Provides MyApis provideMyService(@MyUrl Retrofit retrofit) { return retrofit.create(MyApis.class); } private Retrofit createRetrofit(Retrofit.Builder builder, OkHttpClient client, String url) { return builder .baseUrl(url) .client(client) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } }