Okhttp 身份验证器 addHeader() 与 header()

Dan*_*son 1 android restful-authentication okhttp retrofit2

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

身份验证器通过单独的网络调用更新访问令牌,并将其设置在标头中以再次尝试。代码将与此示例非常相似

我只花了一个小时搞清楚我用错误的方法来再度令牌添加到认证,addHeaderVSheader

作品:

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();
}
Run Code Online (Sandbox Code Playgroud)

不起作用:

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();
}
Run Code Online (Sandbox Code Playgroud)

这里会发生什么,为什么addHeader()行为与header()

Mar*_*een 5

引用文档:

header

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

addHeader

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

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