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

网络拦截器

  当我们在进行封装网络框架的时候,避免不了要在请求的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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值