1. 程式人生 > >Qt實現HTTP的Get/Post請求

Qt實現HTTP的Get/Post請求

藉助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();
	}
}