Russian Qt Forum
Июля 03, 2025, 16:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалить header - QNetworkAccessManager  (Прочитано 5722 раз)
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.024 секунд. Запросов: 17.