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

ghg1uchk  于 2023-04-28  发布在  Android
关注(0)|答案(3)|浏览(170)

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

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

此外,我们应该注意,我们使用RxJavaCallAdapterFactory将响应 Package 到Observable s中。
但是我们在OkHttp拦截器中没有看到任何停止请求的方法。
我们提出了两种方法来解决我们的问题:
a)创建特殊的ApiService.class来 Package API中的每个请求,如下所示:

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

但我们认为这是丑陋和繁琐的解决方案。
B)在Interceptor中抛出一个RuntimeException,然后在我们使用API的每个地方捕获它。
第二个解决方案也不好,因为我们需要在链中包含很多onErrorResumeNext运算符。
也许有人知道,如何以更“聪明”的方式处理我们的情况?
先谢谢你了!

flvlnr44

flvlnr441#

accepted answer中缺少的一件事是,您需要指定协议和消息。如果您不指定,您将获得Exception。看起来像这样:

if (App.specialFlag) {
    return new Response.Builder()
                       .code(418) // Whatever code
                       .body("".toResponseBody(null)) // Whatever body
                       .protocol(Protocol.HTTP_2)
                       .message("Dummy response")
                       .request(chain.request())
                       .build();
} else {
    return chain.proceed(chain.request());
}
sirbozc5

sirbozc52#

一种防止请求被执行(在它开始之前)的方法是简单地按照你的尝试去做,但是增加了Response.Builder

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

编辑26/09/2019更新的答案与Bobstring提到的细节

f4t66c6m

f4t66c6m3#

1.我建议将控制逻辑脚本放在OkHttp之外,因为它只用于发出http请求。如何触发请求以及如何处理响应以更新UI,它不需要关心;
1.如果你愿意,你可以创建一个继承自okhttp3.Interceptor的类,然后覆盖函数intercept并将你的控制逻辑脚本放在里面。

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

相关问题