我们是否有可能在OkHttp拦截器中停止请求?

时间:2016-05-31 08:29:25

标签: android retrofit rx-java okhttp

在我们的应用中,我们遇到了一个特例 - 如果我们的App.specialFlag == true,我们需要停止来自我们代码的任何请求。我们认为,在这种情况下,最好的方法是包括特殊的Interceptor,这将阻止我们的任何请求,如下所示:

if (App.specialFlag) {
    // Somehow stop request
} else {
    return chain.proceed(chain.request());
}

另外,我们应该注意,我们使用RxJavaCallAdapterFactory将回复包装到Observable中。

但我们没有看到任何在OkHttp拦截器中停止请求的方法。

我们提出了两种解决问题的方法:

a)创建特殊的ApiService.class,用于包装API中的每个请求,如下所示:

public Observable<User> getUserDetails() {
    if (App.specialFlag) {
        return Observable.just(null);
    }
    return api.getUserDetails();
}

但我们认为这是一个丑陋而繁琐的解决方案。

b)在Interceptor中抛出RuntimeException,然后在我们使用API​​的每个地方捕获它。

第二种解决方案也不好,因为我们需要在链中包含大量onErrorResumeNext运算符。

可能有人知道,如何以更“聪明”的方式处理我们的情况?...

提前致谢!

3 个答案:

答案 0 :(得分:16)

阻止请求被执行的一种方法(在启动之前)它只是按照您的尝试进行,但添加了Response.Builder

if (App.specialFlag) {
    return new Response.Builder()
                       .code(600) //Simply put whatever value you want to designate to aborted request.
                       .request(chain.request())
                       .build();
} else {
    return chain.proceed(chain.request());
}

答案 1 :(得分:15)

accepted answer中遗漏的一件事是您需要指定协议和消息。如果您未指定将获得异常。看起来像这样:

go build ./folder/
mv ./src/ ./bin/

答案 2 :(得分:0)

  1. 我建议将控制逻辑脚本放在OkHttp之外,因为它仅用于发出http请求。如何触发请求以及如何处理更新UI的响应,它不需要关心;

  2. 如果您愿意,可以创建一个继承自okhttp3.Interceptor的类,然后覆盖函数拦截并将控制逻辑脚本放入其中。

    OkHttpClient client = new OkHttpClient.Builder()
       .connectTimeout(20, TimeUnit.SECONDS)
       .readTimeout(20, TimeUnit.SECONDS)
       .addInterceptor(new Interceptor())
       .build();