向OkHttpClient添加多个拦截器

时间:2018-11-06 09:23:54

标签: android retrofit2 okhttp3

我正在尝试了解并在应用程序中使用拦截器。我正在使用LoggingInterceptor,还包括另一个用于添加授权标头的拦截器。我注意到在添加多个拦截器时,我需要调用chain.proceed(chain.request),它基本上会多次运行请求并在我添加的所有拦截器中产生响应。

这是我很困惑的地方,由于我拥有大量拦截器,我不希望请求多次运行。我有什么办法可以做到这一点?

1 个答案:

答案 0 :(得分:7)

我不确定您看到的结论是您正在多次运行该请求,但是我可以向您保证情况并非如此。

OkHttp拦截器是一条链,因此您在拦截器方法中收到的类的名称为chain。拦截器按请求的添加顺序运行,而响应的添加顺序则相反。例如,如果首先添加日志记录拦截器,然后添加身份验证器,则将首先运行用于请求的日志记录器,然后运行身份验证。这意味着您不会看到请求的身份验证标头(或与此相关的任何其他身份验证字段)记录下来,因为它们是在您记录请求后添加的。

相比之下,如果您在末尾添加日志记录拦截器,则将看到以前的拦截器添加的所有内容。

让我们看一个通用的示例:A->B->C是按字母顺序添加的一系列拦截器。这意味着A首先运行,然后运行B,然后运行C进行请求和响应C首先运行,然后运行B然后运行A 。当A处理完请求后,它可以调用chain.proceed,并将请求继续处理到B。当B想要“处理”链中的请求时,也是如此。完成所有拦截器后,OkHttp执行一次请求,并以相反的顺序通过所有拦截器运行响应。换句话说,这就是链的概念出现的地方。这几乎就像函数编程中的函数组合。

最后,如果可以chain.proceed(chain.request),就不会多次运行请求,只是将其沿着链传递并等待响应。

这里的official explanation比我的要好得多。