网络拦截器
当我们在进行封装网络框架的时候,避免不了要在请求的url上加上我们特定参数。如在请求的头部添加版本号、系统标示、缓存、日志拦截等。那么如何去处理这个需求呢?可以通过以下几个方法来进行处理。
源码下载地址:http://download.csdn.net/detail/gl_mine_csdn/9905444
参数相关
方式一
public class CommonInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取请求 oldRequest
Request oldRequest = chain.request();
//------------------------处理-------------------------------
//得到 builder
FormBody.Builder builder = new FormBody.Builder();
//设置 版本号
builder.add("VersionName","1.0.0");
//设置 机型 1(安卓) 2(IOS)
builder.add("System","1");
//获取 FromBody
FormBody body =builder.build();
//------------------------处理-------------------------------
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(oldRequest.url())
.headers(oldRequest.headers())
.addHeader("AppVersion", "1.0.0")//增加请求的头部
.post(body)
.build();
return chain.proceed(newRequest);
}
}
方式二
public class CommonInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取请求 oldRequest
Request oldRequest = chain.request();
//------------------------处理-------------------------------
// 添加新的参数
HttpUrl.Builder builder = oldRequest.url().newBuilder()
//设置 机型 1(安卓) 2(IOS)
.addQueryParameter("System", "1")
//设置 版本号
.addQueryParameter("VersionName", "1.0.0")
//设置 scheme
.scheme(oldRequest.url().scheme())
//设置 host
.host(oldRequest.url().host());
//------------------------处理-------------------------------
//构建 新的请求
Request newRequest = oldRequest.newBuilder()
.addHeader("AppVersion", "1.0.0")
.method(oldRequest.method(), oldRequest.body())
.url(builder.build())
.build();
return chain.proceed(newRequest);
}
}
日志拦截相关
方式一
//------------------------处理-------------------------------
//HttpLoggingInterceptor 为Okhttp3自带的网络日志拦截器根据设置Level来选择拦截不同的信息
//常用的设置:BODY、HEADERS、BASIC、NONE
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//通过okhttpBuilder 进行日志拦截的设置
okhttpBuilder.addInterceptor(loggingInterceptor);
//------------------------处理-------------------------------
方式二
public class CommonHttpLoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//------------------------处理-------------------------------
//打印 url
Logger.d("接口请求:", request.url().toString());
//打印 body
Logger.d("接口参数:",request.body());
Response response = chain.proceed(request);
if (null!=response && null!=response.body() ) {
//获取 MediaType
MediaType mediaType = response.body().contentType();
//获取 结果体 body
String content = response.body().string();
//打印 请求结果
Logger.d("接口响应:", content);
return response.newBuilder()
.body(ResponseBody.create(mediaType, content))
.build();
}
//------------------------处理-------------------------------
return response;
}
}
缓存相关
方式一
public class CommonCacheInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//------------------------处理-------------------------------
if (!AppUtils.isNetworkAvailable(PayApp.application)) {
// 无网络状态走缓存
request = request
.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
Response responseLatest;
//------------------------处理-------------------------------
//设置缓存存放时间
if (AppUtils.isNetworkAvailable(getApplication())) {
int maxAge = 60 * 60;
responseLatest = response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
//有网时候读接口上的@Headers里的配置
.header("Cache-Control", request.cacheControl().toString())
//或者
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
} else {
int maxStale = 60 * 60 * 24 * 7; // 没网一周后失效
responseLatest = response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
//------------------------处理-------------------------------
return responseLatest;
}
}