Выполнение HTTP-запросов в Qt - PullRequest
4 голосов
/ 18 ноября 2010

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 18 ноября 2010

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

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

Самый простой возможный способ загрузки файла:

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

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

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

5 голосов
/ 18 ноября 2010

Джузеппе прав, вам не нужно использовать libcurl , curlpp и подобные библиотеки. В этом нет необходимости, у Qt есть простой и рабочий класс.

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

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

Примерно так:

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

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

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

Btw. не знаю что ты делаешь Но если это мобильное приложение, я бы порекомендовал вам перейти с VS на IDE QtCreator. Он имеет хороший симулятор и полный набор инструментов для тестирования мобильных устройств.

...