android - 向 OkHttpClient 添加多个拦截器

标签 android retrofit2 okhttp

我正在尝试了解并在应用程序中使用拦截器。我正在使用 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/

相关文章:

android - 如何在Stetho中添加、删除和编辑数据?

java - 将 Retrofit 与 Moshi 结合使用,在执行 POST、PUT 或 PATCH 时如何忽略特定对象属性

android - com.android.volley.NoConnectionError 暂停应用后

android - 半透明导航栏 Lollipop (fitsSystemWindows ="true")

Android CallLog.Calls provider查询问题

android - cordova 构建 minsdkversion 错误

java - 如何在json改造的根部使用可变键解析json

android - 如何防止对象在 Retrofit2 的 API 调用中发送空字段

java - 无法创建新的远程 session 。主机名 (IP_ADDRESS) 未验证

java - 改造后。为每个post请求添加JSON参数