package utils; import android.util.Log; import com.liu.asus.yikezhong.Myapp; import java.io.IOException; import java.util.List; import okhttp3.FormBody; import okhttp3.HttpUrl; import okhttp3.Interceptor; import okhttp3.MultipartBody; import okhttp3.Request; import okhttp3.Response; import okhttp3.logging.HttpLoggingInterceptor; /** * Created by 地地 on 2017/12/10. * 邮箱:461211527@qq.com. */ public class NetInterceptor { private static final int TIMEOUT_CONNECT = 5; //5秒 private static final int TIMEOUT_DISCONNECT = 60 * 60 * 24 * 7; //7天 public static final Interceptor REWRITE_RESPONSE_INTERCEPTOR = new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { //获取retrofit @headers里面的参数,参数可以自己定义,在本例我自己定义的是cache,跟@headers里面对应就可以了 String cache = chain.request().header("cache"); okhttp3.Response originalResponse = chain.proceed(chain.request()); String cacheControl = originalResponse.header("Cache-Control"); //如果cacheControl为空,就让他TIMEOUT_CONNECT秒的缓存,本例是5秒,方便观察。注意这里的cacheControl是服务器返回的 if (cacheControl == null) { //如果cache没值,缓存时间为TIMEOUT_CONNECT,有的话就为cache的值 if (cache == null || "".equals(cache)) { cache = TIMEOUT_CONNECT + ""; } originalResponse = originalResponse.newBuilder() .header("Cache-Control", "public, max-age=" + cache) .build(); return originalResponse; } else { return originalResponse; } } }; public static final Interceptor REWRITE_RESPONSE_INTERCEPTOR_OFFLINE = new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); //离线的时候为7天的缓存。 if (!MyNetUtils.isConnected(Myapp.context)) { request = request.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale="+TIMEOUT_DISCONNECT) .build(); } return chain.proceed(request); } }; public static final Interceptor REWRITE_RESPONSE_INTERCEPTOR_LOG = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { System.out.println("MYOKTTP==="+message); } }).setLevel(HttpLoggingInterceptor.Level.BODY); public static final Interceptor REWRITE_RESPONSE_MYINTERCEPTOR=new Interceptor() { public String TAG = "LogInterceptor"; @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String token = (String) SPUtils.get(Myapp.context, "token", ""); Log.d(TAG,"\n"); Log.d(TAG,"----------Start----------------"+token); String method=request.method(); if("POST".equals(method)){ FormBody.Builder sb = new FormBody.Builder(); if (request.body() instanceof FormBody) { FormBody body = (FormBody) request.body(); for (int i = 0; i < body.size(); i++) { sb.add(body.encodedName(i) , body.encodedValue(i)); } body=sb.add("source","android").add("appVersion","101") .add("token",token) .build(); request=request.newBuilder().post(body).build(); Log.d(TAG, "| "+request.toString()); }else { MultipartBody body=(MultipartBody)request.body(); MultipartBody.Builder build = new MultipartBody.Builder().setType(MultipartBody.FORM); build .addFormDataPart("source","android"); build .addFormDataPart("appVersion","101"); build .addFormDataPart("token",token); List<MultipartBody.Part> parts = body.parts(); for (MultipartBody.Part part : parts) { build.addPart(part); } request =request.newBuilder().post(build.build()).build(); } }else { HttpUrl httpUrl = request.url() .newBuilder() .addQueryParameter("source","android") .addQueryParameter("appVersion","101") .addQueryParameter("token",token) .build(); System.out.println("====httpurl"+httpUrl); request = request.newBuilder().get().url(httpUrl).build(); } return chain.proceed(request); } }; }
日志拦截器 记得导依赖
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'public static final int TIMEOUT=1000*100;
OkHttpClient okHttpClient=new OkHttpClient.Builder() .addInterceptor(NetInterceptor.REWRITE_RESPONSE_MYINTERCEPTOR) .addInterceptor(NetInterceptor.REWRITE_RESPONSE_INTERCEPTOR_LOG) .addInterceptor(NetInterceptor.REWRITE_RESPONSE_INTERCEPTOR_OFFLINE) .addNetworkInterceptor(NetInterceptor.REWRITE_RESPONSE_INTERCEPTOR) .connectTimeout(TIMEOUT, TimeUnit.SECONDS) .readTimeout(TIMEOUT, TimeUnit.SECONDS) .writeTimeout(TIMEOUT, TimeUnit.SECONDS) .retryOnConnectionFailure(false) .cache(cache).build();