Выполнение HTTP-запросов в Qt

Я новичок в Qt. Я установил Qt для VS2008 и интегрировал с моим VS2010. Я просто хочу знать, как сделать HTTP-запросы. Я читал о QtNetwork, но QtHttp устарел.

Я также знаю о libcurl и curlpp, но у меня проблемы с его установкой и работой с Qt.

Что вы рекомендуете, QtNetwork или curlpp? Если QtNetwork, не могли бы вы дать мне пример функции или кусок кода (и какой класс использовать). Если curlpp (libcurl), не могли бы вы указать мне где-нибудь, где я могу найти шаги, чтобы установить его для Qt (или любезно объяснить)?

Большое спасибо.

2 ответа

Решение

libcurl и curlpp - отличные библиотеки, но их использование добавляет в ваш проект зависимость, которой, вероятно, вы можете избежать.

Последние версии Qt рекомендуют использовать QNetworkAccessManager делать сетевые запросы (включая http-запросы) и получать ответы.

Самый простой способ загрузить файл:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://stackru.com")));

Когда replyFinished слот называется, QNetworkReply объект, который он принимает в качестве параметра, будет содержать загруженные данные, а также метаданные (заголовки и т. д.).

Более полный пример можно найти в примерах Qt, вы можете прочитать здесь его исходный код.

Giuseppe is right, you don't need to use libcurl, curlpp and similar libraries. В этом нет необходимости, у Qt есть простой и рабочий класс.

Имейте в виду, что стандартный способ отправки запроса и получения ответа - асинхронный. Вы всегда должны подключить сигнал о завершении менеджера (QNetworkReply*) к слоту.

Если вы отправляете несколько запросов и не хотите добавлять слот для каждого ответа, вы всегда можете запустить цикл событий и подключить сигнал менеджеров к слоту циклов событий quit().

Что-то вроде этого:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QEventLoop *eventLoop = new QEventLoop();
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), eventLoop, SLOT(quit());

manager->get(QNetworkRequest(QUrl("http://stackru.com")));
eventLoop->exec(QEventLoop::ExcludeUserInputEvents);

QByteArray replyData = reply->readAll();
... //do what you want with the data your receive from reply

Btw. не знаю что ты делаешь Но если это мобильное приложение, я бы порекомендовал вам перейти с VS на IDE QtCreator. It has a nice simulator and a complete toolchain for mobile device testing.

Другие вопросы по тегам