Создание HTTP-запросов в Qt
-
26-09-2019 - |
Вопрос
Я новый Qt.. Отказ Я установил QT для VS2008 и интегрирован с моим Vs2010.. Отказ Я просто хочу знать, как сделать HTTP-запросы. Я прочитал о Qtnetwork. Но QTHTTP является окрестите.
Я также знаю о либерл а также Curlpp., но у меня есть проблемы, устанавливающие его, и делая его работать с Qt.
Что ты порекомендуешь, Qtnetwork. или Curlpp.? Если Qtnetwork., Можете ли вы дать мне образец функции или кусочка кода (и какой класс использовать). Если Curlpp (libcurl), не могли бы вы указать мне где-нибудь, где я могу найти шаги, чтобы установить его для Qt. (или пожалуйста, объясните)?
Спасибо большое.
Решение
либерл а также 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, вы можете Читайте здесь свой исходный код.
Другие советы
Джузеппе прав, вам не нужно использовать либерл, 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
Кстати. Не знаю, что ты делаешь. Но если это мобильное приложение, я бы порекомендовал вы переключиться от VS на qtcreator IDE. Он имеет хороший симулятор и полный инструментарий для тестирования мобильных устройств.