Название: [Решено] QNetworkCookieJar не могу понять как с ним работать
Отправлено: petrowsb от Июнь 22, 2018, 12:35
Здравствуйте. Делаю первое приложение с ннтр запросами. Задача следующая: первым запросом post залогиниться вторым запросом get получить json строку Сервер на laravel при логине отдает куку laravel_session=блаблабла, которую нужно отсылать вторым запросом, однако второй запрос выдает страницу с ошибкой. Исподльзую QNetworkCookieJar в документации и везде в сети пишут что этот кукиджяр сам все делает, надо только его определить, что я и сделал по примерам из сети, но все равно не работает! Если я вручную прописываю куку (закоменченная строка в коде ниже), то второй гет запрос отрабатывает нормально и я получаю вожделенную json строку. Подскажите, где у меня может быть ошибка? Уже весь мозг сломал. Вторую неделю мучаюсь и безрезультатно... QNetworkAccessManager *manager = new QNetworkAccessManager(); QNetworkCookieJar *cookieJar = new QNetworkCookieJar(manager); manager->setCookieJar(cookieJar); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(httpReply(QNetworkReply*)));
// первый запрос post
QNetworkRequest req(QUrl("http://example.com/index.php/login")); req.setRawHeader(QByteArray("Host"), QByteArray("example.com")); req.setHeader(QNetworkRequest::UserAgentHeader, QByteArray("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7")); req.setRawHeader(QByteArray("Accept"), QByteArray("text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1")); req.setRawHeader(QByteArray("Referer"), QByteArray("http://example.com/index.php/login")); req.setRawHeader(QByteArray("Connection"), QByteArray("Keep-Alive")); req.setHeader(QNetworkRequest::ContentTypeHeader, QByteArray("application/x-www-form-urlencoded")); req.setRawHeader(QByteArray("Content-length"), QByteArray("31")); QByteArray postData; postData = "login=boris_1&password=boris_1&"; manager->post(req, postData);
//второй запрос get
QNetworkRequest req1(QUrl("http://example.com/index.php/user_api/get_work"));
req1.setRawHeader(QByteArray("Host"), QByteArray("example.com")); req1.setHeader(QNetworkRequest::UserAgentHeader, QByteArray("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7")); req1.setRawHeader(QByteArray("Accept"), QByteArray("text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1")); req1.setRawHeader(QByteArray("Referer"), QByteArray("http://example.com/index.php")); req1.setRawHeader(QByteArray("Connection"), QByteArray("Keep-Alive")); req1.setHeader(QNetworkRequest::ContentTypeHeader, QByteArray("application/x-www-form-urlencoded")); //req1.setRawHeader(QByteArray("Cookie"), //QByteArray("laravel_session=eyJpdiI6IlV1K1hldjNDN3lDOVd1ejdSeFhpVmc9PSIsInZhbHVlIjoiVENqZTZGdUtPYjkwV3dmVFFHXC9cL2Zm //QjBDWGowZFArWXZrVnRTNW5reng2aFk3cjRLNmhkcmRtOE9jNzdTZkw4enk2ZDAwVUpKRzRIN2JLQ0czRTRuZz09IiwibWFjIjoiMjY0ZWE2 //NGZkZGQ0YmMxNWQ5MDI1NDU2NmE3YTAxNGZjMjQ3MmIyZGI1NzY2MGM3N2Y2MDFlYzlmZmRjNzc5OSJ9")); qDebug() << manager->cookieJar()->cookiesForUrl(QUrl("http://example.com/index.php/login")); // здесь выводятся пустые скобки () manager->get(req1);
void AppCore::httpReply(QNetworkReply *reply){ QString httpResponse = reply->readAll(); qDebug() << "Getting reply";
// Здесь куки выводятся qDebug() << "Куки для ЮРЛ: " << reply->manager()->cookieJar()->cookiesForUrl(QUrl("http://example.com/index.php/login/test"));
}
Название: Re: QNetworkCookieJar не могу понять как с ним работать
Отправлено: petrowsb от Июнь 24, 2018, 14:20
Разобрался. Все дело было в АСИНХРОННОСТИ post/get запросов, т.е. первый запрос не дожидается ответа от сервера, а уже отправляется второй запрос, который просто напросто не успевает получить куку от первого запроса. Если отправлять второй запрос внутри слота httpReply, то он прекрасно видит куку, правда программа зацикливается ;) , однако это уже решаемо либо таймаутом либо сигналы/слоты переподключать в процессе выполнения, главное принцип понятен, вопрос можно считать закрытым. Кукиджяр работает нормально)
|