Russian Qt Forum
Ноябрь 23, 2024, 07:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалить header - QNetworkAccessManager  (Прочитано 5471 раз)
Paramon
Гость
« : Июнь 30, 2014, 14:49 »

Собственно устанавливаю заголовок через setRawHeader, как же его удалить перед вторым запросом?
И вообще правильно ли я делаю? Не допускаю ли каких-то утечек? Если я создаю через new - то удаляю через delete. Остальное не трогаю.  Непонимающий
Код:
    QNetworkReply *networkReply;
    QNetworkRequest networkRequest;

    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);

    QNetworkCookieJar *cookieJar = new QNetworkCookieJar(this);
    networkManager->setCookieJar(cookieJar);

    networkRequest.setRawHeader("User-Agent","Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.17");




// запрос 1
    networkRequest.setRawHeader("Content-Type","application/x-www-form-urlencoded");

    networkRequest.setUrl(QUrl("http://site.com"));
    networkReply = networkManager->get(networkRequest);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), &eLoop, SLOT(quit()));
    QTimer::singleShot(10000, &eLoop, SLOT(quit()));
    eLoop.exec();

    if(networkReply->error()!=QNetworkReply::NoError)
    {
        QMessageBox::information(this,0,"ERROR: "+networkReply->errorString(),0,0);
    }

    data = networkReply->readAll();

    networkReply->close();





// запрос 2
    networkRequest.setUrl(QUrl("http://site.com/page1.html"));
    networkReply = networkManager->get(networkRequest);
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), &eLoop, SLOT(quit()));
    QTimer::singleShot(10000, &eLoop, SLOT(quit()));
    eLoop.exec();

    if(networkReply->error()!=QNetworkReply::NoError)
    {
        QMessageBox::information(this,0,"ERROR: "+networkReply->errorString(),0,0);
    }

    data = networkReply->readAll();

    networkReply->close();




    delete(cookieJar);
    delete(networkManager);
Записан
carrygun
Гость
« Ответ #1 : Июль 01, 2014, 04:38 »

В документации не сказано ничего про возможность удаления хедера. Если установка пустого значения не поможет, то придется два объекта для запроса делать, ну или менять логику.
И вы не удаляете networkReply.
Цитировать
Note: After the request has finished, it is the responsibility of the user to delete the QNetworkReply object at an appropriate time. Do not directly delete it inside the slot connected to finished(). You can use the deleteLater() function.
Записан
Paramon
Гость
« Ответ #2 : Июль 01, 2014, 10:28 »

В документации не сказано ничего про возможность удаления хедера. Если установка пустого значения не поможет, то придется два объекта для запроса делать, ну или менять логику.
Пробовал уже и пустое значение, и, на всякий случай, DELETE/D - не помогает. Так и сделал - использую два объекта.

И вы не удаляете networkReply.
Цитировать
Note: After the request has finished, it is the responsibility of the user to delete the QNetworkReply object at an appropriate time. Do not directly delete it inside the slot connected to finished(). You can use the deleteLater() function.
Исправил. Спасибо.  Улыбающийся
Записан
Paramon
Гость
« Ответ #3 : Июль 01, 2014, 10:34 »

Забыл. Хотел бы задать ещё один вопрос касаемо QTimer::singleShot (чтобы не плодить темы).

Вот создаю я таймер после первого запроса, а на втором запросе соединение рвется преждевременно. Методом научного тыка я понял, что рвется из-за первого таймера, который продолжает работать. Как его корректно остановить?  Непонимающий
Записан
carrygun
Гость
« Ответ #4 : Июль 01, 2014, 10:41 »

Вызвать stop() у таймера перед вторыми коннектами, у вас же объект лупа один. Но если честно, то я не очень понял, зачем вам там таймеры?
Записан
Bepec
Гость
« Ответ #5 : Июль 01, 2014, 10:52 »

Если в момент лупа произойдёт непредвиденная ситуация, программа будет висеть вечно.
Так же это страховка от вложенных циклов. Недавно темка была.
Записан
carrygun
Гость
« Ответ #6 : Июль 01, 2014, 11:00 »

Может произойти что-то экстраординарное кроме error() и finished()?
Записан
Paramon
Гость
« Ответ #7 : Июль 01, 2014, 11:12 »

Вызвать stop() у таймера перед вторыми коннектами, у вас же объект лупа один.
Уж извините за тупость, но каким образом вызвать стоп?  Непонимающий

Но если честно, то я не очень понял, зачем вам там таймеры?
Для задания таймаута, если сервер не ответит n секунд. На всех форумах советуют делать так.
Записан
carrygun
Гость
« Ответ #8 : Июль 01, 2014, 11:14 »

Да, понял, особые тонкости TCP. Не вижу вот, можно ли где-нибудь настроить таймауты для QNAM?
Записан
Bepec
Гость
« Ответ #9 : Июль 01, 2014, 14:17 »

Вариантов "не ответа" масса Веселый начиная от проблем с сетью(бесконечный запрос при физическом отключении), заканчивая кривыми руками. Мои руки такую ситуацию смогли создать Веселый

PS таймаутов не видел.
Записан
carrygun
Гость
« Ответ #10 : Июль 02, 2014, 04:40 »

Уж извините за тупость, но каким образом вызвать стоп?  Непонимающий

Наверное, стоит отказаться от использования статического метода.
Записан
Paramon
Гость
« Ответ #11 : Июль 02, 2014, 08:53 »

Разобрался. Всем спасибо.  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.