【问题标题】:Retrofit2: how to save cookies from responseRetrofit2:如何从响应中保存 cookie
【发布时间】:2019-04-25 03:10:24
【问题描述】:

我需要从 cookie 中添加一些授权信息以响应下一个请求。

它在邮递员中工作 - 我发出授权请求,然后是第二个请求,它工作正常。但是如果我删除 cookie - 第二个请求返回错误,我必须再次进行授权请求。

但在我的应用程序中,第二个请求总是返回相同的错误。我试图通过拦截器找到需要的cookie,但我没有找到它

val client = OkHttpClient.Builder()
    .addInterceptor(OAuthInterceptor())

private class OAuthInterceptor : Interceptor {
    override fun intercept(chain: Chain): Response {
        val request = chain.request()
        com.app.logic.toLog("${chain.proceed(request).header("set-cookie")} ") // it's not that cookie what I looking for
        val headers = chain.proceed(request).headers()
        headers.names().forEach {
            val s = headers.get(it)
            com.app.logic.toLog("$it -> $s")
        }
        return chain + (Session.authConsumer?.let { consumer ->
            consumer.sign(request).unwrap() as Request
        } ?: request)
    }
}

有人知道我还能尝试什么吗?

【问题讨论】:

    标签: android cookies kotlin retrofit2 okhttp


    【解决方案1】:

    所以,我终于找到了使用 cookie 的解决方案

    val client = OkHttpClient.Builder()
        .cookieJar(UvCookieJar())
    
    private class UvCookieJar : CookieJar {
    
        private val cookies = mutableListOf<Cookie>()
    
        override fun saveFromResponse(url: HttpUrl, cookieList: List<Cookie>) {
            cookies.clear()
            cookies.addAll(cookieList)
        }
    
        override fun loadForRequest(url: HttpUrl): List<Cookie> =
            cookies
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用此this gist 了解如何在收到 cookie 并将其发送回您的请求中的标头中。

      【讨论】:

      • 谢谢,我认为它可以提供帮助。但在这个解决方案中,我需要 Context 并且我需要使用共享首选项。我找到了解决这个问题的更简单方法
      • 您始终可以使用应用程序上下文。
      • 是的,我可以。但我宁愿避免为此使用上下文和首选项。正如我所说-没有它们还有另一种方法
      • 谢谢!这正是我想要的。
      猜你喜欢
      • 2017-07-22
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多