您的位置:首页 > 理论基础 > 计算机网络

网络框架拦截的处理方式 网络拦截器

2017-07-20 17:11 357 查看

网络拦截器

  当我们在进行封装网络框架的时候,避免不了要在请求的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

bf6d
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐