向 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 会比我的好很多。
我正在尝试了解并在应用程序中使用拦截器。我正在使用 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 会比我的好很多。