【问题标题】:Okhttp Authenticator addHeader() vs header()Okhttp Authenticator addHeader() vs header()
【发布时间】:2020-01-12 07:40:46
【问题描述】:

在使用拦截器和身份验证器添加访问令牌标头时,我的身份验证器在服务器响应 401 时正确调用。

身份验证器通过单独的网络调用更新访问令牌并将其设置在标头中以重试。代码将非常相似to this sample

我花了一个小时才发现我使用错误的方法将更新的令牌添加到身份验证器 addHeader vs header

作品:

if (accessToken != null){
   // retry the failed 401 request with new access token
   return response.request().newBuilder()
                            .header("Authorization", accessToken) // use the new access token
                            .build();
}

不起作用:

if (accessToken != null){
   // retry the failed 401 request with new access token
   return response.request().newBuilder()
                            .addHeader("Authorization", accessToken) // use the new access token
                            .build();
}

这里可能发生了什么以及为什么addHeader() 的行为与header() 不同

【问题讨论】:

  • header() 在每次 API 调用时更新其 name 的现有标头,而 addHeader 在标头列表中添加一个新标头,同时保留先前具有无效授权的标头。跨度>

标签: android retrofit2 okhttp restful-authentication


【解决方案1】:

引用文档:

header

将名为 {@code name} 的标头设置为 {@code value}。如果此请求已经有任何具有该名称的标头,则它们都将被替换。

addHeader

添加带有 {@code name} 和 {@code value} 的标题。对于像“Cookie”这样的多值标头,更喜欢这种方法。请注意,对于某些标头,包括 {@code Content-Length} 和 {@code Content-Encoding},OkHttp 可能会将 {@code value} 替换为从请求正文派生的标头。

所以header 将替换如果已添加,而addHeader 通常不会。

【讨论】:

  • 好的,所以有两种不同的功能,一种允许您拥有多个相同的标题键?有没有你能想到的单一用例在哪里有用?!我只是完全不明白addHeader 的目的
  • 文档说明了addHeader 的一个用例——“更喜欢这种方法用于像“Cookie”这样的多值标头”——我相信这会变成一个 cookie 标头,而不是添加另一个条目。对于其他用途,它可能会失败 - 我没有尝试过。
【解决方案2】:

根据文档 .header() 将用您提供的新值替换那里的任何值。如果您使用 .addHeader(),旧的标头仍然存在,并且您正在添加您传入的新标头。

换句话说,使用 addHeader() 会给你两个访问令牌,一个不起作用,一个起作用。使用 .header() 可以完成您真正想做的事情。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 2020-04-05
    • 2019-09-02
    • 2016-07-09
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多