作者:书友49812911 | 来源:互联网 | 2022-11-30 15:30
我正在尝试了解和在应用程序中使用拦截器。我正在使用LoggingInterceptor,还包括另一个用于添加授权标头的拦截器。我注意到在添加多个拦截器时,我需要进行调用chain.proceed(chain.request)
,该调用基本上会多次运行请求,并在我添加的所有拦截器中产生响应。
这是我很困惑的地方,由于我拥有拦截器的数量,我不希望请求多次运行。有什么办法可以实现?
1> Fred..:
我不确定您看到的结论是您正在多次运行该请求,但是我可以向您保证情况并非如此。
OkHttp
拦截器是一条链,因此是chain
您在拦截器方法中收到的类的名称。拦截器按请求的添加顺序运行,而响应的添加顺序则相反。例如,如果您先添加日志记录拦截器,然后添加身份验证器,则将首先运行用于请求的日志记录器,然后运行身份验证。这意味着您将不会看到请求的身份验证标头(或与此相关的任何其他身份验证字段),因为它们是在您记录请求后添加的。
相比之下,如果在末尾添加日志记录拦截器,则将看到以前的拦截器添加的所有内容。
让我们看一个通用的示例:A->B->C
是以字母顺序添加的一系列拦截器。这意味着A
先运行,然后B
再运行,C
对于请求和响应C
,先运行,然后B
再运行A
。当A
与要求完成的,它可以调用chain.proceed
,它会与请求继续进行B
。同样的B
,当它要“继续”在链中的请求。完成所有拦截器后,OkHttp
将执行一次请求,并以相反的顺序通过所有拦截器运行响应。换句话说,这就是链的概念出现的地方。这几乎类似于函数编程中的函数组合。
最后,如果您调用chain.proceed(chain.request)
,则不会多次运行该请求,只是将其沿链传递并等待响应。
这是官方的解释,它将比我的要好得多。