OkHttp拦截器实现禁止一切网络请求

拦截器玩出花。

Posted by YSY on July 6, 2019

我们在创建OkHttp客户端时,可以添加各种拦截器,这是我见过最有可玩性的库之一:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .addInterceptor(new XXXInterceptor())
        .addInterceptor(new YYYInterceptor())
        ....
        .build();

设想这么一个场景,用户有一个开关,可以允许或禁止应用内的一切网络请求,如何用拦截器来实现? 为了不让大家觉得我又在水贴,直入主题。 我们可以通过构造一个404的response来拦截请求:

private static class NetworkInterceptor implements Interceptor {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        if (/*你妈妈不准你上网*/) {
            return new okhttp3.Response.Builder()
                    .code(404) // 其实code可以随便给
                    .protocol(Protocol.HTTP_2)
                    .message("Network is closed by mom")
                    .body(ResponseBody.create(MediaType.get("text/html; charset=utf-8"), "")) // 返回空页面
                    .request(chain.request())
                    .build();            
        } else {
            return chain.proceed(chain.request());                    
        }
    }
}

一定要记住哦,code,protocol,message,body缺一不可。