banner
Alexeisie

AlexEisie

啊? Email: alexeisie@brs.red
github

Qt6/5 網路編程-HTTP GET/POST請求

開發平台為 VS2022+Qt 組件,可能與 QtCreator 略有不同

1. 為專案配置 Network 庫#

image
Qt 安裝目錄下的應當有 include 文件夾和 lib 文件夾,其中分別可以找到文件夾 QtNetwork 與文件 Qt6Network.lib (Debug 編譯為 Qt6Networkd.lib,Qt5 為 Qt5Network.lib)
image
在專案屬性中 C/C++--> 常規 --> 附加包含目錄中添加行

$(QTDIR)\include\QtNetwork

image
在專案屬性中鏈接器 --> 輸入 --> 附加依賴庫中添加行

$(QTDIR)\lib\Qt6Network.lib

Release 模式同理自行配置頭文件和庫文件

2. 頭文件#

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

QtNetwork 是異步的,每個進程中需要一個 QNetworkAccessManager 對象來進行網絡對象管理
我們將通過 QNetworkRequest 進行請求
通過 QNetworkReply 獲取響應

3. 函數實現#

//QtNetwork.cpp
connect(ui.GETButton, SIGNAL(clicked()), this, SLOT(onGETButtonClicked()));

假設將 GETButton 的點擊信號與槽函數 onGETButtonClicked 進行綁定

//QtNetwork.hpp private slots:
void onGETButtonClicked() {
    QNetworkRequest request;
    QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
    connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));

    request.setUrl(QUrl("https://www.baidu.com"));
    QNetworkReply* reply = naManager->get(request);
}

首先建立 QNetworkAccessManager 和 QNetworkRequest 對象,naManager 請用 new 建立(前面提到 QNetwork 是異步的,不阻塞的情況下 QNetworkAccessManager 退出函數就會被銷毀)
接著將 naManager 的 finished (QNetworkReply*) 信號與槽函數 requestFinished (QNetworkReply*) 綁定
設置 request 的 HTTP 請求 Url,並建立對象 reply 獲取 GET 請求響應

void requestFinished(QNetworkReply* reply) {
	QString Result;
	// 獲取http狀態碼
	QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
	if (statusCode.isValid())
		Result+=QString("status code=%1\n").arg(statusCode.toInt());

	QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
	if (reason.isValid())
		Result+=QString("reason=%1\n").arg(reason.toString());

	QNetworkReply::NetworkError err = reply->error();
	if (err != QNetworkReply::NoError) {
		Result+=QString("Failed: %1\n").arg(reply->errorString());
	}
	else {
		// 獲取返回內容
		Result+= reply->readAll();
	}
	ui.Result->setText(Result);
}

先前使用 reply 獲取響應結果,在這裡解析響應即可

參考文章:https://blog.csdn.net/china_jeffery/article/details/83246355

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。