Retrofit2:如何从响应中保存 cookie
Retrofit2: how to save cookies from response
我需要从 cookie 添加一些授权信息以响应下一个请求。
它适用于邮递员 - 我发出授权请求,然后是第二个请求,效果很好。但是,如果我删除 cookie - 第二次请求 returns 错误,我必须再次进行授权请求。
但是在我的应用程序中,第二个请求总是 returns 同样的错误。我试图通过拦截器找到需要的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)
}
}
有人知道我还能尝试什么吗?
您可以使用此 this gist 了解如何在收到 cookie 时拦截它们并在 header 的请求中将它们发回。
所以,我终于找到了使用 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
}
我需要从 cookie 添加一些授权信息以响应下一个请求。
它适用于邮递员 - 我发出授权请求,然后是第二个请求,效果很好。但是,如果我删除 cookie - 第二次请求 returns 错误,我必须再次进行授权请求。
但是在我的应用程序中,第二个请求总是 returns 同样的错误。我试图通过拦截器找到需要的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)
}
}
有人知道我还能尝试什么吗?
您可以使用此 this gist 了解如何在收到 cookie 时拦截它们并在 header 的请求中将它们发回。
所以,我终于找到了使用 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
}