Russian Qt Forum

Qt => Работа с сетью => Тема начата: petrowsb от Июнь 22, 2018, 12:35



Название: [Решено] 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, то он прекрасно видит куку, правда программа зацикливается ;) , однако это уже решаемо либо таймаутом либо  сигналы/слоты переподключать в процессе выполнения, главное принцип понятен, вопрос можно считать закрытым. Кукиджяр работает нормально)