基于Qt开发的http/https客户端

成果展示:
在这里插入图片描述
使用Qt开发HTTP客户端主要依赖QNetworkAccessManager、QNetworkRequest和QNetworkReply三大核心类。以下是具体实现要点及最佳实践:

一、核心类与基础流程​​

1.QNetworkAccessManager​​

作为HTTP请求的管理者,负责异步处理网络通信,支持GET/POST/PUT/DELETE等方法。需在类成员中声明并通过new创建:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
2.QNetworkRequest​​

封装请求的元数据,包括URL、请求头(Headers)和属性。需设置目标地址及内容类型:

QNetworkRequest request(QUrl("http://example.com/api"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
3.QNetworkReply​​

接收服务器响应,通过信号finished()触发数据处理。需在槽函数中读取数据并释放对象:

connect(reply, &QNetworkReply::finished, [=]() {if (reply->error() == QNetworkReply::NoError) {QByteArray data = reply->readAll();qDebug() << "Response:" << data;}reply->deleteLater();
});

二、GET与POST请求实现​​

​​1. GET请求​​

​​步骤​​
通过manager->get(request)发送请求,URL可直接包含查询参数:

QNetworkReply *reply = manager->get(QNetworkRequest(QUrl("http://example.com/data?id=1")));
2. POST请求​​
  • 数据提交​​
    使用manager->post(request, data)发送表单或JSON数据:
QByteArray postData = "username=admin&password=123456";  // 表单数据
// 或 JSON格式
postData = QJsonDocument(jsonObject).toJson();
QNetworkReply *reply = manager->post(request, postData);
  • 头部设置​​
    根据数据类型调整Content-Type,例如application/x-www-form-urlencoded或application/json

三、响应处理与错误机制​​

1.数据读取​​

在finished()槽函数中通过reply->readAll()获取完整响应,注意编码转换(如UTF-8):

QTextCodec *codec = QTextCodec::codecForName("utf8");
QString text = codec->toUnicode(reply->readAll());
2.错误处理​​

检查reply->error()并记录错误信息,处理网络超时、SSL证书异常等场景:

if (reply->error() != QNetworkReply::NoError) {qDebug() << "Error:" << reply->errorString();
}

四、高级功能扩展​​

1.HTTPS支持​​

需在项目配置文件(.pro)中添加QT += network,并确保系统SSL证书有效:

QT += network
2.设置SSL协议版本
    QSslConfiguration sslConfig = request.sslConfiguration();sslConfig.setProtocol(QSsl::AnyProtocol); // 设置SSL协议版本request.setSslConfiguration(sslConfig);
3.设置同步请求
    QEventLoop loop;connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);loop.exec();

五、实践注意事项​​

  • 线程安全​​:避免在主线程中执行耗时网络操作,建议使用QThread或异步信号槽。
  • ​​资源释放​​:务必调用reply->deleteLater()防止内存泄漏。
  • 用户代理与自定义头​​:通过setRawHeader()设置UA或认证信息(如Authorization: Bearer token)。

六、完整代码示例:

1.界面设计:

在这里插入图片描述

2.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
public slots:void click_sendButton();void requestHttp(const QString url,QString body);void requestHttps(const QString url,QString body);private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
3.mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtNetwork/QHostAddress>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include<QEventLoop>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->sendButton,&QPushButton::clicked,this,&MainWindow::click_sendButton);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::click_sendButton()
{QString url = ui->urlEdit->text();QString body = ui->bodyEdit->toPlainText();//requestHttp(url,body);requestHttps(url,body);
}void MainWindow::requestHttp(const QString url, QString body)
{QString requestType = ui->requestComBox->currentText();QString params = ui->gsEdit->text();QString header = ui->headercomBox->currentText();QNetworkAccessManager networkManager;QNetworkRequest request;request.setUrl(QUrl(url));//请求头token设置request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=utf-8"));if(header=="Content-Type")request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(params));elserequest.setRawHeader(header.toUtf8(), params.toUtf8());QNetworkReply *reply;if(requestType=="Post")reply = networkManager.post(request, body.toUtf8());else if(requestType=="Get")reply = networkManager.get(request);//请求响应结果connect(reply, &QNetworkReply::finished, [&]() {if (reply->error() == QNetworkReply::NoError) {QByteArray bytes = reply->readAll();QString msg = QString::fromUtf8(bytes);ui->resultEdit->append(msg);}else {qDebug() << "Error:" << reply->errorString();QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档QString data = "Request errors, statusCode:" + QString::number(statusCodeV.toInt()) + ", errorCode : " + QString::number((int)reply->error());ui->resultEdit->append(data);}reply->deleteLater();});//开启事件循环,直到请求完成QEventLoop loop;connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);loop.exec();
}void MainWindow::requestHttps(const QString url, QString body)
{QString requestType = ui->requestComBox->currentText();QString params = ui->gsEdit->text();QString header = ui->headercomBox->currentText();QNetworkAccessManager networkManager;QNetworkRequest request;request.setUrl(QUrl(url));request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=utf-8"));if(header=="Content-Type")request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(params));elserequest.setRawHeader(header.toUtf8(), params.toUtf8());QSslConfiguration sslConfig = request.sslConfiguration();sslConfig.setProtocol(QSsl::AnyProtocol); // 设置SSL协议版本request.setSslConfiguration(sslConfig);QNetworkReply *reply;if(requestType=="Post")reply = networkManager.post(request, body.toUtf8());else if(requestType=="Get")reply = networkManager.get(request);//请求响应结果connect(reply, &QNetworkReply::finished, [&]() {if (reply->error() == QNetworkReply::NoError) {QByteArray bytes = reply->readAll();QString msg = QString::fromUtf8(bytes);ui->resultEdit->append(msg);}else {qWarning() << "Error:" << reply->errorString();QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档QString data = "Request errors, statusCode:" + QString::number(statusCodeV.toInt()) + ", errorCode : " + QString::number((int)reply->error());ui->resultEdit->append(data);}reply->deleteLater();});//开启事件循环,直到请求完成QEventLoop loop;connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);loop.exec();
}
4.main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

更多Qt开发实战教程,持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自适应蒙特卡洛定位-AMCL

自适应蒙特卡洛定位&#xff0c;简称AMCL&#xff0c;主要提供定位功能并以/tf形式输出 蒙特卡洛算法的基本思想&#xff1a;当所要求的问题是某种事件出现的概率或者是某个变量的期望值时&#xff0c;它们可以通过某种"试验"的方法&#xff0c;得到这种事件出现的概…

鲁滨逊归结原理详解:期末考点+解题指南

1. 引言 归结原理&#xff08;Resolution Principle&#xff09; 是自动定理证明和逻辑推理的核心技术&#xff0c;由约翰艾伦罗宾逊&#xff08;John Alan Robinson&#xff09;于1965年提出。它是一阶谓词逻辑的机械化推理方法&#xff0c;广泛应用于人工智能&#xff08;如…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务开通教程以及模型体验

在当今数字化浪潮迅猛推进的时代&#xff0c;云计算与人工智能技术的深度融合正不断催生出众多创新应用与服务&#xff0c;为企业和个人用户带来了前所未有的便利与发展机遇。本文将重点聚焦于在华为云这一行业领先的云计算平台上&#xff0c;对 DeepSeek-V3/R1 商用服务展开的…

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解 目录 Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 PSO-MVMD粒子群算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),以包…

自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例

自然语言处理NLP中的连续词袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、优势、作用和程序举例 目录 自然语言处理NLP中的连续词袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、优势、作用和程序举例一、连续词袋( Cont…

商业模式解密:鸣鸣很忙下沉市场的隐忧,破局之路在何方?

文 | 大力财经 作者 | 魏力 在零售行业的版图中&#xff0c;“鸣鸣很忙”凭借独特的商业模式&#xff0c;在下沉市场异军突起&#xff0c;成为不可忽视的力量。555亿GMV、广泛的县域覆盖以及高比例的乡镇门店&#xff0c;无疑彰显了其在下沉市场的王者地位。然而&#xff0c;…

YOLOv5推理代码解析

代码如下 import cv2 import numpy as np import onnxruntime as ort import time import random# 画一个检测框 def plot_one_box(x, img, colorNone, labelNone, line_thicknessNone):"""description: 在图像上绘制一个矩形框。param:x: 框的坐标 [x1, y1, x…

CATIA高效工作指南——常规配置篇(二)

一、结构树&#xff08;Specification Tree&#xff09;操作技巧精讲 结构树是CATIA设计中记录模型历史与逻辑关系的核心模块&#xff0c;其高效管理直接影响设计效率。本节从基础操作到高级技巧进行系统梳理。 1.1 结构树激活与移动 ​​激活方式​​&#xff1a; ​​白线…

批量重命名bat

作为一名程序员&#xff0c;怎么可以自己一个个改文件名呢&#xff01; Windows的批量重命名会自动加上括号和空格&#xff0c;看着很不爽&#xff0c;写一个bat处理吧&#xff01;❥(ゝω・✿ฺ) 功能&#xff1a;将当前目录下的所有文件名里面当括号和空格都去掉。 用法&…

嵌入式软件开发常见warning之 warning: implicit declaration of function

文章目录 &#x1f9e9; 1. C 编译流程回顾&#xff08;背景&#xff09;&#x1f4cd; 2. 出现 warning 的具体阶段&#xff1a;**编译阶段&#xff08;Compilation&#xff09;**&#x1f9ec; 2.1 词法分析&#xff08;Lexical Analysis&#xff09;&#x1f332; 2.2 语法分…

【人工智能-agent】--Dify中MCP工具存数据到MySQL

本文记录的工作如下&#xff1a; 自定义MCP工具&#xff0c;爬取我的钢铁网数据爬取的数据插值处理自定义MCP工具&#xff0c;把爬取到的数据&#xff08;str&#xff09;存入本地excel表格中自定义MCP工具&#xff0c;把爬取到的数据&#xff08;str&#xff09;存入本地MySQ…

Golang 应用的 CI/CD 与 K8S 自动化部署全流程指南

一、CI/CD 流程设计与工具选择 1. 技术栈选择 版本控制&#xff1a;Git&#xff08;推荐 GitHub/GitLab&#xff09;CI 工具&#xff1a;Jenkins/GitLab CI/GitHub Actions&#xff08;本文以 GitHub Actions 为例&#xff09;容器化&#xff1a;Docker Docker Compose制品库…

网络基础1(应用层、传输层)

目录 一、应用层 1.1 序列化和反序列化 1.2 HTTP协议 1.2.1 URL 1.2.2 HTTP协议格式 1.2.3 HTTP服务器示例 二、传输层 2.1 端口号 2.1.1 netstat 2.1.2 pidof 2.2 UDP协议 2.2.1 UDP的特点 2.2.2 基于UDP的应用层…

基于大模型预测的吉兰 - 巴雷综合征综合诊疗方案研究报告大纲

目录 一、引言(一)研究背景(二)研究目的与意义二、大模型预测吉兰 - 巴雷综合征的理论基础与技术架构(一)大模型原理概述(二)技术架构设计三、术前预测与手术方案制定(一)术前预测内容(二)手术方案制定依据与策略四、术中监测与麻醉方案调整(一)术中监测指标与数…

【言语】刷题2

front&#xff1a;刷题1 ⭐ 前对策的说理类 题干 新时代是转型关口&#xff0c;要创新和开放&#xff08;前对策&#xff09;创新和开放不能一蹴而就&#xff0c;但是对于现代化很重要 BC片面&#xff0c;排除 A虽然表达出了创新和开放很重要&#xff0c;体现了现代化&#xf…

Blueprints - Gameplay Message Subsystem

一些学习笔记归档&#xff1b; Gameplay Message是C插件&#xff0c;安装方式是把插件文件夹拷贝到Plugins中&#xff08;没有的话需要新建该文件夹&#xff09;&#xff0c;然后再刷新源码&#xff0c;运行项目&#xff1b; 安装后还需要在插件中激活&#xff1a; 这样&#…

火山云网站搭建

使用火山引擎的 **火山云&#xff08;Volcano Engine Cloud&#xff09;** 搭建网站&#xff0c;主要涉及云服务器、存储、网络等核心云服务的配置。以下是搭建网站的基本步骤和关键点&#xff1a; --- ### **一、准备工作** 1. **注册火山引擎账号** - 访问火山引擎官网&…

嵌入式开发学习(第二阶段 C语言基础)

直到型循环的实现 特点&#xff1a;先执行&#xff0c;后判断&#xff0c;不管条件是否满足&#xff0c;至少执行一次。 **代表&#xff1a;**do…while,goto&#xff08;已经淘汰&#xff0c;不推荐使用&#xff09; do…while 语法&#xff1a; 循环变量; do {循环体; }…

Nginx +Nginx-http-flv-module 推流拉流

这两天为了利用云服务器实现 Nginx 进行OBS Rtmp推流&#xff0c;Flv拉流时发生了诸多情况&#xff0c;记录实现过程。 环境 OS&#xff1a;阿里云CentOS 7.9 64位Nginx&#xff1a;nginx-1.28.0Nginx-http-flv-module&#xff1a;nginx-http-flv-module-1.2.12 安装Nginx编…

射频ADRV9026驱动

参考&#xff1a; ADRV9026 & ADRV9029 Prototyping Platform User Guide [Analog Devices Wiki] 基于ADRV9026的四通道射频收发FMC子卡-CSDN博客 adrv9026 spi 接口验证代码-CSDN博客