2010-11-18 3 views
4

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

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

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

спасибо.

ответ

6

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"))); 

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

Более полный пример можно найти в примерах Qt, вы можете read here its source code.

5

Джузеппе прав, вам не нужно использовать Libcurl, curlpp и подобные библиотеки. Нет необходимости в этом, у 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://stackoverflow.com"))); 
eventLoop->exec(QEventLoop::ExcludeUserInputEvents); 

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

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

Смежные вопросы