Intereting Posts
Индексный оператор Котлина vs get (0) В чем разница между этими способами для определения функций? Ошибка теста блока привязки к андроидной ошибке Не удалось проанализировать параметры компилятора привязки данных. Params: Как определить собственные свойства для моделей на основе Йены? Как проверить, отсортирован ли массив строк в алфавитном порядке или нет с помощью Kotlin? Out-projected type в универсальном интерфейсе запрещает использование метода с общим параметром Firebase-firestore не может использовать два документа Не удалось найти класс databinding.FragmentBinding Как скомпилировать модуль домена Kotlin с клиентским модулем с Gradle? Spring Data JPA / Hibernate "Невозможно найти атрибут с заданным именем" Как использовать фрагменты с kotlin Метод вызова из класса Kotlin Возьмите последний элемент n в Котлине Есть ли какой-нибудь метод в Kotlin, который позволяет мне перевести значение из диапазона в другой диапазон? Лучший способ применить преобразование к каждому элементу в списке одновременно в Котлине

OkHttp CookieJar не может добавить cookie для запроса

Я пытаюсь добавить сохраненный cookie проверки подлинности для дальнейших запросов, используя CookieJar. И при получении правильного файла cookie и сохранения его в банке отлично работает, проверяя response.request().headers() , cookie нигде не встречается.

Я обнаружил, что это особенно странно, поскольку я обнаружил, что отладкой loadForRequest() вызывается для запроса и возвращает правильный файл cookie. При использовании этого точного файла cookie в Postman для подделки запроса он возвращает желаемый результат (страница без формы входа).

Может кто-нибудь попытаться объяснить, что мне не хватает?

Класс, в котором используется банка

 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"] } } 

Помощь очень ценится. Я был долгое время, но это первый раз, когда я был в шоке от проблемы.

    Я бы рекомендовал использовать существующую банку cookie вместо того, чтобы создавать свои собственные. Правила, связанные с куки-файлами, могут получить большой комплекс.

     import okhttp3.JavaNetCookieJar; CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager); OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build(); 

    Кроме того, чтобы помочь отлаживать, вы можете настроить ведение журнала отладки OkHttp с помощью перехватчика .

     Logger logger = LoggerFactory.getLogger(HttpUtil.class); HttpLoggingInterceptor logging = new HttpLoggingInterceptor((msg) -> { logger.debug(msg); }); logging.setLevel(Level.BODY); client.addNetworkInterceptor(logging);