向 OkHttpClient 添加多个拦截器

Adding Multiple Interceptors to an OkHttpClient

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

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

我不确定您看到什么可以得出您多次 运行 请求的结论,但我可以向您保证情况并非如此。

OkHttp 拦截器以链的形式工作,因此您在拦截器方法中收到的 class 的名称为 chain。拦截器按请求的添加顺序 运行 和响应的添加顺序 reverse-order 。例如,如果您首先添加日志记录拦截器,然后添加身份验证拦截器,那么您将首先 运行ning 请求的日志记录拦截器,然后是身份验证拦截器。这意味着您不会看到记录的请求的身份验证 headers(或与此相关的任何其他身份验证字段),因为它们是在您记录请求后添加的。

相比之下,如果您在最后添加日志拦截器,您将看到之前拦截器添加的所有内容。

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

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

这是 official explanation 会比我的好很多。