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

1
2
3
4
5
6
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.addInterceptor(new XXXInterceptor())
.addInterceptor(new YYYInterceptor())
....
.build();

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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缺一不可。