//需要的自提
public class RetrofitManager {
private static RetrofitManager mRetrofitManager;
private final Retrofit mRetrofit;
private static String BASE_URL = "https://www.zhaoapi.cn/";
public RetrofitManager(String baseUrl) {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(bulidOkHttpClient())
.build();
}
public static RetrofitManager getDefault() {
return mRetrofitManager = new RetrofitManager(BASE_URL);
}
private OkHttpClient bulidOkHttpClient() {
//缓存路径
File cacheFile = new File(App.getContext().getCacheDir().getAbsolutePath(), "HttpCache");
Cache cache = new Cache(cacheFile, 1024 * 1024 * 10);//缓存文件为10MB
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
HashMap<String, String> map = new HashMap<>();
map.put("source", "android");
map.put("appVersion", "101");
PublicParamInterceptor paramInterceptor = new PublicParamInterceptor(map);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(5000, TimeUnit.MILLISECONDS)
.writeTimeout(5000, TimeUnit.MILLISECONDS)
.connectTimeout(5000, TimeUnit.MILLISECONDS)
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(paramInterceptor)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
int maxAge = 60*60; // 有网络时 设置缓存超时时间1个小时
int maxStale = 60 * 60 * 24 * 28; // 无网络时,设置超时为4周
Request request = chain.request();
if (OkHttpUtil.isNetworkReachable(App.getContext())) {
request= request.newBuilder()
.addHeader("apikey", "2ffc3e48c7086e0e1faa003d781c0e69")
.cacheControl(CacheControl.FORCE_NETWORK)//有网络时只从网络获取
.build();
}else {
request= request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)//无网络时只从缓存中读取
.build();
}
Response response = chain.proceed(request);
if (OkHttpUtil.isNetworkReachable(App.getContext())) {
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;
}
})
.connectTimeout(2, TimeUnit.SECONDS)
.cache(cache)
.build();
return okHttpClient;
}
public <T> T create(Class<T> Clazz) {
return mRetrofit.create(Clazz);
}
public class PublicParamInterceptor implements Interceptor {
Map<String, String> paramMap = new HashMap<>();
public PublicParamInterceptor(Map<String, String> paramMap) {
this.paramMap = paramMap;
}
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
//拿到原来的request
Request oldRequest = chain.request();
//拿到请求的url地址
String url = oldRequest.url().toString();
//判断是get还是post请求
if (oldRequest.method().equalsIgnoreCase("GET")) {
if (paramMap != null && paramMap.size() > 0) {
StringBuilder builder = new StringBuilder(url);
//接收公共的请求参数
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
builder.append("&" + entry.getKey() + "=" + entry.getValue());
}
url = builder.toString();
//如果之前的url没有?,我们需要手动给添加一个?
if (!url.contains("?")) {
url = url.replaceFirst("&", "?");
}
//根据原来的request构造一个新的request
Request request = oldRequest.newBuilder()
.url(url)
.build();
return chain.proceed(request);
}
} else {
if (paramMap != null && paramMap.size() > 0) {
RequestBody body = oldRequest.body();
if (body != null && body instanceof FormBody) {
FormBody formBody = (FormBody) body;
//把原来body里面的参数添加到新的body中
FormBody.Builder builder = new FormBody.Builder();
//为了防止添加相同的key和value
HashMap<String, String> temMap = new HashMap<>();
for (int i = 0; i < formBody.size(); i++) {
builder.add(formBody.encodedName(i), formBody.encodedValue(i));
temMap.put(formBody.encodedName(i), formBody.encodedValue(i));
}
//把公共请求的参数添加到新的body中
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
if (!temMap.containsKey(entry.getKey())) {
builder.add(entry.getKey(), entry.getValue());
}
}
FormBody newformBody = builder.build();
//依据原来的request构造一个新的request
Request request = oldRequest.newBuilder()
.post(newformBody)
.build();
return chain.proceed(request);
}
}
}
return chain.proceed(oldRequest);
}
}
}
//okHttpUtils
/**
* 判断网络是否可用
*
* @param context Context对象
*/
public static Boolean isNetworkReachable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo current = cm.getActiveNetworkInfo();
if (current == null) {
return false;
}
return (current.isAvailable());
}