向OkHttpClient添加多个拦截器

idr*_*mbi 5 android retrofit2 okhttp3

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

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

Fre*_*red 18

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

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

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

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

最后,如果您调用chain.proceed(chain.request),则不会多次运行该请求,只是将其沿链传递并等待响应。

这是官方的解释,它将比我的要好得多。

  • 基本上就是他说的^:D (3认同)
  • 如果不是这个答案,我不会理解拦截器是这样工作的,并且文档中没有任何地方说明(引用的维基页面上的图像除外)。非常感谢。 (2认同)