我正在尝试了解并在应用程序中使用拦截器。我正在使用 LoggingInterceptor还包括另一个用于添加授权 header 的拦截器。我注意到在添加多个拦截器时,我需要调用 chain.proceed(chain.request)
,它基本上多次运行请求并在我添加的所有拦截器中产生响应。
这是我很困惑的地方,由于我拥有的拦截器数量,我不希望请求运行多次。有什么办法可以实现这一目标吗?
最佳答案
我不确定您从中得出的结论是您多次运行请求,但我可以向您保证情况并非如此。
OkHttp
拦截器以链的形式工作,因此您在拦截器方法中收到的类的名称为 chain
。拦截器按照请求的添加顺序运行,响应的添加顺序相反。例如,如果您首先添加日志记录拦截器,然后添加身份验证拦截器,那么您将首先为请求运行日志记录拦截器,然后是身份验证拦截器。这意味着您不会看到记录的请求的身份验证 header (或与此相关的任何其他身份验证字段),因为它们是在您记录请求后添加的。
相比之下,如果您在末尾添加日志记录拦截器,您将看到之前的拦截器添加的所有内容。
让我们看一个通用示例:A->B->C
是按字母顺序添加的拦截器链。这意味着 A
首先运行,然后是 B
然后是 C
对于请求和响应 C
首先运行,然后B
然后是 A
。当 A
完成请求时,它可以调用 chain.proceed
并继续向 B
发送请求。 B
想要“处理”链中的请求时也是如此。一旦所有拦截器都完成,OkHttp
将执行请求一次 并以相反的顺序通过所有拦截器运行响应。换句话说,这就是链的概念出现的地方。它几乎就像函数式编程中的函数组合。
最后,如果您调用 chain.proceed(chain.request)
,您不会多次运行请求,您只是将它沿着链传递并等待响应。
这是 official explanation这会比我的好得多。
关于android - 向 OkHttpClient 添加多个拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53168964/