当前位置: 首页 > article >正文

Qt实现HTTP GET/POST/PUT/DELETE请求

引言

在现代应用程序开发中,HTTP请求是与服务器交互的核心方式。Qt作为跨平台的C++框架,提供了强大的网络模块(QNetworkAccessManager),支持GET、POST、PUT、DELETE等HTTP方法。本文将手把手教你如何用Qt实现这些请求,并附完整代码示例。


环境准备

  • Qt版本:Qt 5.x 或 Qt 6.x(本文代码兼容两者)

  • 模块配置:在.pro文件中添加 QT += network


一、Qt网络模块核心类

QNetworkAccessManager

Qt通过QNetworkAccessManager管理HTTP请求,其特点包括:

  • 异步处理,通过信号槽机制返回结果。

  • 支持HTTPS、Cookie、代理等高级功能。

  • 自动管理线程安全。


二、实现HTTP请求的通用步骤

  1. 创建QNetworkAccessManager对象。

  2. 构建请求对象QNetworkRequest并设置URL/Header。

  3. 发送请求,获取QNetworkReply对象。

  4. 绑定finished()信号处理响应数据。


三、HTTP请求方法实现

1. GET请求:获取资源

void sendGetRequest(const QString& url) {QNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request;request.setUrl(QUrl(url));QNetworkReply *reply = manager->get(request);connect(reply, &QNetworkReply::finished, [=]() {if (reply->error() == QNetworkReply::NoError) {QByteArray data = reply->readAll();qDebug() << "GET Response:" << data;} else {qDebug() << "GET Error:" << reply->errorString();}reply->deleteLater();manager->deleteLater();});
}

2. POST请求:提交数据

发送JSON数据
void sendPostRequest(const QString& url, const QJsonObject& json) {QNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");QByteArray postData = QJsonDocument(json).toJson();QNetworkReply *reply = manager->post(request, postData);connect(reply, &QNetworkReply::finished, [=]() {// 处理响应(同GET示例)});
}

3. PUT请求:更新资源

void sendPutRequest(const QString& url, const QByteArray& data) {QNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");QNetworkReply *reply = manager->put(request, data);// 响应处理逻辑同上
}

4. DELETE请求:删除资源

void sendDeleteRequest(const QString& url) {QNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request(url);QNetworkReply *reply = manager->deleteResource(request);// 响应处理逻辑同上
}

四、关键问题与优化

1. 异步处理与事件循环

  • 避免在回调中阻塞UI线程,可使用QEventLoop实现同步请求(谨慎使用)。

  • 使用QTimer设置请求超时。

    //GET为例
    void sendGetRequest(const QString& url) {QNetworkAccessManager *manager = new QNetworkAccessManager(this);QNetworkRequest request;request.setUrl(QUrl(url));QNetworkReply *reply = manager->get(request);QTimer::singleShot(8000, [&reply](){reply->close();});//请求时间超过8s直接关闭请求QEventLoop eventLoop;connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));eventLoop.exec();if(reply->error() != QNetworkReply::NoError){QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);qDebug("request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());}QByeteArray outRet = reply->readAll();reply->deleteLater();manager->deleteLater();
    }

2. HTTPS支持

  • 需在项目中配置SSL证书(QSslConfiguration)。

  • 处理sslErrors信号以忽略证书验证(开发环境适用)。

相关文章:

Qt实现HTTP GET/POST/PUT/DELETE请求

引言 在现代应用程序开发中&#xff0c;HTTP请求是与服务器交互的核心方式。Qt作为跨平台的C框架&#xff0c;提供了强大的网络模块&#xff08;QNetworkAccessManager&#xff09;&#xff0c;支持GET、POST、PUT、DELETE等HTTP方法。本文将手把手教你如何用Qt实现这些请求&a…...

从零开始开发HarmonyOS应用并上架

开发环境搭建&#xff08;1-2天&#xff09; 硬件准备 操作系统&#xff1a;Windows 10 64位 或 macOS 10.13 内存&#xff1a;8GB以上&#xff08;推荐16GB&#xff09; 硬盘&#xff1a;至少10GB可用空间 软件安装 下载 DevEco Studio 3.1&#xff08;官网&#xff1a;…...

Redis安全与配置问题——AOF文件损坏问题及解决方案

Java 中的 Redis AOF 文件损坏问题全面解析 一、AOF 文件损坏的本质与危害 1.1 AOF 持久化原理 Redis 的 AOF&#xff08;Append-Only File&#xff09; 通过记录所有写操作命令实现持久化。文件格式如下&#xff1a; *2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n *3\r\n$3\r\nSET\r\…...

Java 线程池与 Kotlin 协程 高阶学习

以下是Java 线程池与 Kotlin 协程 高阶学习的对比指南&#xff0c;结合具体代码示例&#xff0c;展示两者在异步任务处理中的差异和 Kotlin 的简化优势&#xff1a; 分析&#xff1a; 首先&#xff0c;我们需要回忆Java中线程池的常见用法&#xff0c;比如通过ExecutorService创…...

3.第二阶段x64游戏实战-分析人物移动实现人物加速

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;2.第二阶段x64游戏实战-x64dbg的使用 想找人物的速度&#xff0c;就需要使用Ch…...

leetcode 746. Min Cost Climbing Stairs

这道题用动态规划解决。这道题乍一看&#xff0c;含义有点模糊。有两个点要搞清楚&#xff1a;1&#xff09;给定len个台阶的梯子&#xff0c;其实是要爬完&#xff08;越过&#xff09;整个梯子才算到达顶部&#xff0c;相当于顶部是第len1层台阶。台阶序号从0开始编号的话&am…...

网络信息安全应急演练方案

信息安全应急演练方案 总则 &#xff08;一&#xff09;编制目的 旨在建立并完善应对病毒入侵、Webshell 攻击以及未授权访问等信息安全突发事件的应急机制&#xff0c;提升组织对这类事件的快速响应、协同处理和恢复能力&#xff0c;最大程度降低事件对业务运营、数据安全和…...

H.264编码解析与C++实现详解

一、H.264编码核心概念 1.1 分层编码结构 H.264采用分层设计&#xff0c;包含视频编码层&#xff08;VCL&#xff09;和网络抽象层&#xff08;NAL&#xff09;。VCL处理核心编码任务&#xff0c;NAL负责封装网络传输数据。 1.2 NALU单元结构 // NAL单元头部结构示例 struc…...

Python入门(5):异常处理

目录 1 异常处理基础概念 1.1 什么是异常&#xff1f; 1.2 异常与错误的区别 2 异常处理基础 2.1 常见内置异常类型 2.2 try-except 基本结构 2.3 捕获多个异常 2.4 抛出异常 2.4.1 使用raise语句 2.4.2 自定义异常类 3 高级异常处理技巧 3.1 不要过度捕…...

Scala(三)

本节课学习了函数式编程&#xff0c;了解到它与Java、C函数式编程的区别&#xff1b;学习了函数的基础&#xff0c;了解到它的基本语法、函数和方法的定义、函数高级。。。学习到函数至简原则&#xff0c;高阶函数&#xff0c;匿名函数等。 函数的定义 函数基本语法 例子&…...

什么是 Java 泛型

一、什么是 Java 泛型&#xff1f; 泛型&#xff08;Generics&#xff09; 是 Java 中一种强大的编程机制&#xff0c;允许在定义类、接口和方法时使用类型参数。通过泛型&#xff0c;可以将数据类型作为参数传递&#xff0c;从而实现代码的通用性和类型安全。 简单来说&…...

Unity中根据文字数量自适应长宽的对话气泡框UI 会自动换行

使用Ugui制作一个可以根据文本数量自动调整宽度,并可以自动换行的文字UI 或者不要独立的Bg,那么一定要把bg的img设置成切片...

【小也的Java之旅系列】02 分布式集群详解

文章目录 前言为什么叫小也 本系列适合什么样的人阅读正文单体优点缺点 CAP为什么CAP不可能全部满足&#xff1f;CAP 三选二 分布式事务分布式方案——SeataXA模式&#xff08;强一致&#xff09;AT模式&#xff08;自动补偿&#xff0c;默认模式&#xff09;TCC模式&#xff0…...

Ubuntu里安装Jenkins

【方式1】&#xff1a;下载war包&#xff0c;直接运行&#xff0c;需提前搭建Java环境&#xff0c;要求11或17&#xff0c;不推荐&#xff0c;war包下载地址&#xff0c;将war包上传到服务器&#xff0c;直接使用命令启动 java -jar /data/jenkins/jenkins.war【方式2】&#…...

C++包管理工具vcpkg的安装使用教程

前言 使用vcpkg可以更方便地安装各种库&#xff0c;省去配置的时间和配置失败的风险&#xff0c;类似python中的anaconda&#xff0c;懒人必备 参考 安装参考&#xff1a;https://bqcode.blog.csdn.net/article/details/135831901?fromshareblogdetail&sharetypeblogde…...

微服务面试题:配置中心

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

Qt msvc2017程序无法用enigma vitrual box打包,用winrar打包

我们通常打包Qt程序用Enigma virtual box。这样我们的程序就可以在别的电脑上也能运行&#xff0c;但是有时候&#xff0c;我们发现Enigma virtual box在打包的时候&#xff0c;对于msvc2017需要编译的程序中引用webengineview模块&#xff0c;打包时候发现不能运行。 我们如何…...

微服务集成测试 -华为OD机试真题(A卷、JavaScript)

题目描述 现在有n个容器服务&#xff0c;服务的启动可能有一定的依赖性&#xff08;有些服务启动没有依赖&#xff09;&#xff0c;其次&#xff0c;服务自身启动加载会消耗一些时间。 给你一个n n 的二维矩阵useTime&#xff0c;其中useTime[i][i]10表示服务i自身启动加载需…...

Springboot实战:如何用Docker和Kubernetes部署微服务

前言 随着微服务架构的普及&#xff0c;如何高效部署和管理这些分布式服务成为了开发者面临的重要挑战。Spring Boot凭借其简化配置、快速开发的特性&#xff0c;成为了构建微服务的理想框架&#xff1b;而Docker和Kubernetes则分别解决了服务的容器化和编排问题。本文将详细介…...

Mac: 运行python读取CSV出现 permissionError

在MAC机器里&#xff0c;之前一直运行程序在某个指定的目录下读取excel和csv文件&#xff0c;没有出现错误&#xff0c;有一天突然出现错误&#xff1a;permissionError:[Errno 1] Operation not permitted&#xff0c; 具体错误信息如下&#xff1a; 经过调查得知&#xff0c…...

UE5 学习笔记 FPS游戏制作30 显示击杀信息 水平框 UI模板(预制体)

文章目录 一制作单条死亡信息框水平框的使用创建一个水平框添加子元素调整子元素顺序子元素的布局插槽尺寸填充对齐 制作UI 根据队伍&#xff0c;设置文本的名字和颜色声明变量 将变量设置为构造参数根据队伍&#xff0c;设置文本的名字和颜色在构造事件中&#xff0c;获取玩家…...

西门子TCP通讯过程中硬件连接突然断开

通信原理探秘又结合在工作中遇到的问题,关注到了通讯中的KeepAlive定时器的设置,所以做了如下实验。 硬件: 1513PLC TCP客户端 PC TCP服务器 前提条件:禁用PLC侧KeepAlive 程序: 测试流程: 打开PC端网络调试助手,设置为TCP服务器,打开链接; PC端打开WireShack软…...

Android学习总结之算法篇三(打家劫舍)

打家劫舍一 // 动态规划 class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) return 0;if (nums.length 1) return nums[0];int[] dp new int[nums.length];dp[0] nums[0];dp[1] Math.max(dp[0], nums[1]);for (int i 2; i < nums.lengt…...

【蓝桥杯】单片机设计与开发,速成备赛

一、LED模块开看&#xff0c;到大模板 二、刷第零讲题目&#xff08;直接复制模板&#xff09; 三、空降芯片模板直接调用部分&#xff08;听完再敲代码&#xff09; 四、第十三讲开刷省赛题&#xff08;开始自己背敲模板&#xff09; 五、考前串讲刷一遍 b连接&#xff1…...

【操作系统】Linux进程管理和调试

在 Linux 中&#xff0c;可以通过以下方法查看 PID&#xff08;进程ID&#xff09;对应的进程名称和详细信息&#xff1a; 1. 使用 ps 命令&#xff08;最直接&#xff09; ps -p <PID> -o pid,comm,cmd示例&#xff1a; ps -p 1234 -o pid,comm,cmd输出&#xff1a; P…...

2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议

——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代&#xff1a;新能源赛道「超级独角兽」 作为全球动力电池龙头&#xff0c;宁德时代&#xff08;CATL&#xff09;的江湖地位无需多言&#xff1a; 技术硬实力&#xff1a;麒麟电池、钠离子电池、无钴电池等黑科技加持&…...

基于 Ollama DeepSeek、Dify RAG 和 Fay 框架的高考咨询 AI 交互系统项目方案

基于 Ollama DeepSeek、Dify RAG 和 Fay 框架的高考咨询 AI 交互系统 一、项目概述 本项目旨在构建一个智能化的高考咨询助手&#xff0c;结合 AI 大模型、知识增强&#xff08;RAG&#xff09;和 3D 数字人交互&#xff0c;为用户提供智能高考问答、志愿填报建议、政策解读等…...

【 Vue 2 中的 Mixins 模式】

Vue 2 中的 Mixins 模式 在 Vue 2 里&#xff0c;mixins 是一种灵活的复用代码的方式&#xff0c;它能让你在多个组件间共享代码。借助 mixins&#xff0c;你可以把一些通用的选项&#xff08;像 data、methods、computed 等&#xff09;封装到一个对象里&#xff0c;然后在多…...

Spring Boot @RequestParam 解析参数时的常见问题及解决方案

1&#xff0c;遇到的问题&#xff1a;将后端接口写完后我想通过PostMan进行简单的测试一下&#xff0c;一不小心就遇到了这样的情况&#xff1a; org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…...

linux xargs命令学习

命令描述 xargs从标准输入中读取默认以空格分隔的项&#xff08;可以使用双引号保护空格&#xff09;&#xff08;或单引号或反斜杠&#xff09;或换行符&#xff0c;并执行命令&#xff08;默认为/bin/echo&#xff09;一次或多次&#xff0c;后面跟着任何初始参数从标准输入中…...