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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Множество запросов QHttp  (Прочитано 4608 раз)
QuAzI
Гость
« : Декабрь 30, 2011, 16:28 »

Есть база, из неё периодически нужно проверять данные на нескольких хостах. Изобразил что-то такое
Код:
// в конструкторе
    connect(&http, SIGNAL(readyRead(const QHttpResponseHeader)), this,
            SLOT(readData(const QHttpResponseHeader)));

// в функции выборки из базы данных нескольких адресов, по которым нужно стянуть данные
            QHttpRequestHeader header( "GET", url.path() );
            header.setValue( "Host", url.host() );
            http.setHost( url.host() );
            id = http.request( header );
В итоге в readData(const QHttpResponseHeader) приходит ответ с первым запрошенным id... И всё, больше ничего не приходит, остальные здохли, на них даже done не вызывается. Как правильно сделать опрос нескольких хостов? Делать лист QHttp и тыкать каждый запрос в слот отдельно? Не очень красиво, ИМХО.
И, на сколько я понял, получить URL обратно из QHttp (методы обратные setHost, setPath) или QHttpResponse тоже дохлый номер, только хранить массив с привязкой id адреса к id запроса?

И третий вопрос, так, между делом. Как эту бяку заставить работать с proxy, например squid? Логин/пароль не требуется. Проксь умеет кэшировать.
Код:
    proxy.setHostName("192.168.0.1");
    proxy.setPort(3128);
    proxy.setType(QNetworkProxy::HttpProxy);
    QNetworkProxy::setApplicationProxy(proxy);
    http.setProxy(proxy);
Вроде как webView данные тянет, а QHttp всё равно отпинывает то с неопределённой ошибкой, то с неверным запросом, в зависимости от указания типа прокси.
Записан
fuCtor
Гость
« Ответ #1 : Декабрь 31, 2011, 10:02 »

Используйте QNetworkAccessManager, у него есть метод get. После линкуйте QNetworkResponse полученный с нужным слотом, в котором уже нужно будет следить, от кого именно пришел ответ.
Записан
QuAzI
Гость
« Ответ #2 : Декабрь 31, 2011, 10:19 »

QNetworkResponce не несёт достаточной информации, чтобы определить от кого он пришёл без лишних бубнов. Т.е. имея два или более (смотря сколько записей в таблице) запросов на один слот (не создавать же слот на каждый новый запрос?) отличить их не получилось.
Создал список подключений и более-менее успешно кувыркаюсь через него
Код:
class id_pair{
    public:
    int http_id, rec_id;
    QHttp *http;
};
Так создаю пачку запросов
Код:
        query.exec("select id, url from links");
        while (query.next())
        {
            id_pair pair;
            pair.rec_id = query.value(0).toInt();
            QUrl url(query.value(1).toString());
            pair.http = new QHttp(url.host());

            connect(pair.http, SIGNAL(requestFinished(int,bool)), this,
                    SLOT(http_finished(int,bool)));

            pair.http_id = pair.http->get(url.path());
            mypairs.append( pair );
        }
В requestFinished в отличие от done и readReady передаётся id HTTP-запроса, чем и получилось относительно удачно воспользоваться.
Код:
void MainWindow::http_finished(int id, bool error)
{
    for (int i=0; i<mypairs.count(); i++)
    if (mypairs.at(i).http_id==id)
    {
        QHttp *http = mypairs.at(i).http;
        if (error | (http->lastResponse().statusCode() != 200))
        {
            qDebug() << "http finished with error" << id << http->error() << http->errorString() << http->state();
            qDebug() << http->currentRequest().toString();
        }
        else
        {
            parse(mypairs.at(i).rec_id, http->readAll());
        }
      http->~QHttp();
      mypairs.removeAt(i);
      i = mypairs.count();
    }
}
Вроде работает. Осталось с Proxy разобраться и когда возвращается lastResponce=301 Permanent Redirect.
Записан
fuCtor
Гость
« Ответ #3 : Декабрь 31, 2011, 18:13 »

У меня была задача: параллельно выкачивать файлы.
Создавать для каждого файла класс качальщик избыточно. Поэтому выбрал следующее решение:
1) при отправке запроса создавал временный файл, указатель на него помещал в QNetworkResponce (QObject::setProperty)
2) при получении данных извлекал указатель на файл (QObject::property)
3) используя полученный указатель на файл производил в него запись
4) когда приходил сигнал о завершении опять же извлекал указатель, закрывал файл и переносил куда надо (опять же целевой путь можно положить в динамическое свойство)
5) PROFIT

Кто мешает и вам укладывать в свойство объекта некоторый параметр, по которому можно идентифицировать запрос.
Записан
QuAzI
Гость
« Ответ #4 : Январь 03, 2012, 16:20 »

хм. Как-то я не подумал что через QObject::property можно протащить такое счастье. Надо будет попробовать.
Записан
Gorthauer
Гость
« Ответ #5 : Январь 08, 2012, 01:53 »

QHTTP это жесткий deprecated и из Qt5 будет исключен!
Записан
QuAzI
Гость
« Ответ #6 : Январь 11, 2012, 13:38 »

И чем его заменить?
Записан
fuCtor
Гость
« Ответ #7 : Январь 12, 2012, 10:41 »

И чем его заменить?

QNetworkAccessManager::post
QNetworkAccessManager::get
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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