Qt實現HTTP的Get/Post請求
阿新 • • 發佈:2018-12-16
藉助Qt的NetWork
模組,可以輕鬆的實現HTTP的Get/Post請求,而不需要再次引用像libcurl這樣的第三方庫。
當然,Qt的NetWork
模組提供的功能遠遠不只是HTTP方面的。
標頭檔案
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
另外,使用Qt網路模組還需要引用Qt5Network.lib
庫。
Get
void QtGuiApplication::onBtnGetClicked() { QNetworkRequest request; QNetworkAccessManager* naManager = new QNetworkAccessManager(this); QMetaObject::Connection connRet = QObject::connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*))); Q_ASSERT(connRet); request.setUrl(QUrl("https://www.baidu.com")); QNetworkReply* reply = naManager->get(request); }
請求是非同步的,當請求完成之後,會呼叫void requestFinished(QNetworkReply* reply);
槽函式:
void QtGuiApplication::requestFinished(QNetworkReply* reply) { // 獲取http狀態碼 QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if(statusCode.isValid()) qDebug() << "status code=" << statusCode.toInt(); QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); if(reason.isValid()) qDebug() << "reason=" << reason.toString(); QNetworkReply::NetworkError err = reply->error(); if(err != QNetworkReply::NoError) { qDebug() << "Failed: " << reply->errorString(); } else { // 獲取返回內容 qDebug() << reply->readAll(); } }
Post
void QtGuiApplication::onBtnPushClicked() { QNetworkRequest request; QNetworkAccessManager* naManager = new QNetworkAccessManager(this); QMetaObject::Connection connRet = QObject::connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*))); Q_ASSERT(connRet); request.setUrl(QUrl("https://www.baidu.com")); QString testData = "test"; QNetworkReply* reply = naManager->put(request, testData.toUtf8()); }
同樣,請求也是非同步的,當請求完成之後,會呼叫void requestFinished(QNetworkReply* reply);
槽函式(和Get一樣):
void QtGuiApplication::requestFinished(QNetworkReply* reply) {
// 獲取http狀態碼
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if(statusCode.isValid())
qDebug() << "status code=" << statusCode.toInt();
QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
if(reason.isValid())
qDebug() << "reason=" << reason.toString();
QNetworkReply::NetworkError err = reply->error();
if(err != QNetworkReply::NoError) {
qDebug() << "Failed: " << reply->errorString();
}
else {
// 獲取返回內容
qDebug() << reply->readAll();
}
}