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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。