CookieJarを利用して、保存された認証Cookieを追加リクエストに追加しようとしています。そして正しい認証クッキーを取得し、それをjarファイルに保存している間、大きな成功を収めていますが、response.request().headers()
を調べると、クッキーはどこにも見つかりません。OkHttp CookieJarがリクエストにクッキーを追加できません
デバッグで見つかったので、これは特に奇妙なものでした。これは、loadForRequest()
が要求のために呼び出され、その正しいクッキーを返します。その正確な同じCookieをPostmanで使用してリクエストを偽装すると、目的の結果(ログインフォームのないページ)が返されます。
誰かが迷っていることを説明できますか?
クラスのjarを利用する
class HTMLRoutes {
var scheme = "https"
var host = "www.mangaupdates.com"
val cookieJar = MULoginCookieJar()
var client = OkHttpClient.Builder()
.cookieJar(cookieJar)
.build()
/*Other code*/
private fun getHTMLFromUrl(url: HttpUrl): String {
var request = Request.Builder()
.url(url)
.build()
client.newCall(request).execute().use { response ->
//Right before returning response the loadForRequest() method gets called in the MUCookieJar class
if (response.isSuccessful) {
//response.request.headers = ""
if (response.body() != null) {
return response.body()!!.string()
} else {
throw IOException("Response body is empty")
}
} else {
throw IOException("Unexpected code" + response)
}
}
}
}
私をCookieJar
class MULoginCookieJar : CookieJar {
private var secureSessionCookie: Cookie? = null
override fun saveFromResponse(url: HttpUrl?, cookies: MutableList<Cookie>?) {
if (url != null && cookies != null) {
if (url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") {
for (cookie in cookies) {
if(cookie.name() == "secure_session") {
secureSessionCookie = cookie
}
}
}
}
}
override fun loadForRequest(url: HttpUrl?): List<Cookie>? { // url = https://www.mangaupdates.com/series.html?id=14829
if(url != null && url.pathSegments().size > 0 && url.pathSegments()[0] == "login.html") {
return emptyList()
}
val cookies: List<Cookie> = if(secureSessionCookie==null) emptyList() else listOf(secureSessionCookie!!)
return cookies // = ["secure_session=601bbc74; expires=Sun, 07 Oct 2018 20:45:24 GMT; domain=www.mangaupdates.com; path=/; secure; httponly"]
}
}
ヘルプは非常に高く評価されています。私は長い時間のlurkerされているが、これは私が問題で困惑したのは初めてです。
クッキーが送信されていないことを確認するために何をしていますか?設定に応じて、リクエストにCookieが追加される前にインターセプタが実行される可能性があります。 –
@Jesse Wilson 'client.newCall(request).execute()。use {response - >'で応答が返された直後にデバッグを行うと、 'response'に格納されたOkHttp Responseに' response 'の空文字列があります。 request.headers'です。これがクッキーが送信されていないことを保証する決定的な方法であるかどうかは分かりませんが、クッキーが送信された場合、ヘッダーに 'Set-Cookie .......'私は私の実装に邪魔をしているわけでもありません。あなたは1つを追加することを提案していますか? –
response.networkResponse()。request()と同じですか? –