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信號以忽略證書驗證(開發環境適用)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75371.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

echarts+HTML 繪制3d地圖,加載散點+散點點擊事件

首先&#xff0c;確保了解如何本地引入ECharts庫。 html 文件中引入本地 echarts.min.js 和 echarts-gl.min.js。 可以通過官網下載或npm安裝&#xff0c;但這里直接下載JS文件更簡單。需要引入 echarts.js 和 echarts-gl.js&#xff0c;因為3D地圖需要GL模塊。 接下來是HTM…

深度剖析 MySQL 與 Redis 緩存一致性:理論、方案與實戰

在當今的互聯網應用開發中&#xff0c;MySQL 作為可靠的關系型數據庫&#xff0c;與 Redis 這一高性能的緩存系統常常協同工作。然而&#xff0c;如何確保它們之間的數據一致性&#xff0c;成為了開發者們面臨的重要挑戰。本文將深入探討 MySQL 與 Redis 緩存一致性的相關問題&…

DAO 類的職責與設計原則

1. DAO 的核心職責 DAO&#xff08;Data Access Object&#xff0c;數據訪問對象&#xff09;的主要職責是封裝對數據的訪問邏輯&#xff0c;但它與純粹的數據實體類&#xff08;如 DTO、POJO&#xff09;不同&#xff0c;也與 Service 業務邏輯層不同。 DAO 應該做什么&…

【Kubernetes】如何使用 kubeadm 搭建 Kubernetes 集群?還有哪些部署工具?

使用 kubeadm 搭建 Kubernetes 集群是一個比較常見的方式。kubeadm 是 Kubernetes 提供的一個命令行工具&#xff0c;它可以簡化 Kubernetes 集群的初始化和管理。下面是使用 kubeadm 搭建 Kubernetes 集群的基本步驟&#xff1a; 1. 準備工作 確保你的環境中有兩臺或更多的機…

Pycharm(十二)列表練習題

一、門和鑰匙 小X在一片大陸上探險&#xff0c;有一天他發現了一個洞穴&#xff0c;洞穴里面有n道門&#xff0c; 打開每道門都需要對應的鑰匙&#xff0c;編號為i的鑰匙能用于打開第i道門&#xff0c; 而且只有在打開了第i(i>1)道門之后&#xff0c;才能打開第i1道門&#…

在未歸一化的線性回歸模型中,特征的尺度差異可能導致模型對特征重要性的誤判

通過數學公式來更清晰地說明歸一化對模型的影響&#xff0c;以及它如何改變特征的重要性評估。 1. 未歸一化的情況 假設我們有一個線性回歸模型&#xff1a; y β 0 β 1 x 1 β 2 x 2 ? y \beta_0 \beta_1 x_1 \beta_2 x_2 \epsilon yβ0?β1?x1?β2?x2?? 其…

JS—頁面渲染:1分鐘掌握頁面渲染過程

個人博客&#xff1a;haichenyi.com。感謝關注 一. 目錄 一–目錄二–頁面渲染過程三–DOM樹和渲染樹 二. 頁面渲染過程 瀏覽器的渲染過程可以分解為以下幾個關鍵步驟 2.1 解析HTML&#xff0c;形成DOM樹 瀏覽器從上往下解析HTML文檔&#xff0c;將標簽轉成DOM節點&#…

niuhe插件, 在 go 中渲染網頁內容

思路 niuhe 插件生成的 go 代碼是基于 github.com/ma-guo/niuhe 庫進行組織管理的, niuhe 庫 是對 go gin 庫的一個封裝&#xff0c;因此要顯示網頁, 可通過給 gin.Engine 指定 HTMLRender 來實現。 實現 HTMLRender 我們使用 gitee.com/cnmade/pongo2gin 實現 1. main.go …

openEuler24.03 LTS下安裝HBase集群

前提條件 安裝好Hadoop完全分布式集群&#xff0c;可參考&#xff1a;openEuler24.03 LTS下安裝Hadoop3完全分布式 安裝好ZooKeeper集群&#xff0c;可參考&#xff1a;openEuler24.03 LTS下安裝ZooKeeper集群 HBase集群規劃 node2node3node4MasterBackup MasterRegionServ…

LVGL移植說明

https://www.cnblogs.com/FlurryHeart/p/18104596 參考&#xff0c;里面說明了裸機移植以及freeRTOS系統移植。 移植到linux https://blog.csdn.net/sunchao124/article/details/144952514

ubuntu虛擬機裁剪img文件系統

1. 定制文件系統前期準備 將rootfs.img文件準備好&#xff0c;并創建target文件夾2. 掛載文件系統 sudo mount rootfs.img target #掛載文件系統 sudo chroot target #進入chroot環境3. 內裁剪文件系統 增刪裁剪文件系統 exit #退出chroot環境 sudo umount target…

esp826601s固件燒錄方法(ch340+面包板)

esp826601s固件燒錄方法&#xff08;ch340面包板&#xff09; 硬件 stm32f10c8t6&#xff0c;esp826601s,面包板&#xff0c;ch340(usb轉ttl),st_link&#xff08;供電&#xff09; 接線 燒錄時&#xff1a; stm32f10c8t6&#xff1a;gnd->負極&#xff0c; 3.3->正極…

Servlet 點擊計數器

Servlet 點擊計數器 引言 Servlet 是 Java 企業版&#xff08;Java EE&#xff09;技術中的一種服務器端組件&#xff0c;用于處理客戶端請求并生成動態內容。本文將詳細介紹如何使用 Servlet 實現一個簡單的點擊計數器&#xff0c;幫助讀者了解 Servlet 的基本用法和原理。 …

LangChain vs. LlamaIndex:深入對比與實戰應用

目錄 引言LangChain 與 LlamaIndex 概述 什么是 LangChain&#xff1f;什么是 LlamaIndex&#xff1f;兩者的核心目標與適用場景 架構與設計理念 LangChain 的架構設計LlamaIndex 的架構設計關鍵技術差異 核心功能對比 數據連接與處理查詢與檢索機制上下文管理能力插件與擴展性…

【Java中級】10章、內部類、局部內部類、匿名內部類、成員內部類、靜態內部類的基本語法和細節講解配套例題鞏固理解【5】

?? 【內部類】干貨滿滿&#xff0c;本章內容有點難理解&#xff0c;需要明白類的實例化&#xff0c;學完本篇文章你會對內部類有個清晰的認知 &#x1f495; 內容涉及內部類的介紹、局部內部類、匿名內部類(重點)、成員內部類、靜態內部類 &#x1f308; 跟著B站一位老師學習…

內容中臺:驅動多渠道營銷的關鍵策略

在數字營銷快速發展的今天&#xff0c;企業需要在多個渠道&#xff08;網站、社交媒體、移動應用等&#xff09;上同步管理內容。盡管網站仍是品牌展示的核心&#xff0c;但信息分散、多平臺重復創建內容的問題&#xff0c;讓營銷人員面臨巨大的管理挑戰。 內容中臺&#xff0…

SvelteKit 最新中文文檔教程(17)—— 僅服務端模塊和快照

前言 Svelte&#xff0c;一個語法簡潔、入門容易&#xff0c;面向未來的前端框架。 從 Svelte 誕生之初&#xff0c;就備受開發者的喜愛&#xff0c;根據統計&#xff0c;從 2019 年到 2024 年&#xff0c;連續 6 年一直是開發者最感興趣的前端框架 No.1&#xff1a; Svelte …

CMake 中的置變量

在 CMake 中&#xff0c;變量是存儲和傳遞信息的重要方式。以下是一些常用的 CMake 變量&#xff0c;以表格形式列出&#xff0c;包括它們的名稱、含義和常見用途&#xff1a; 變量名稱含義常見用途CMAKE_CURRENT_SOURCE_DIR當前處理的 CMakeLists.txt 文件所在的源代碼目錄的…

深入解析C++類:面向對象編程的核心基石

一、類的本質與核心概念 1.1 類的基本定義 類是將**數據&#xff08;屬性&#xff09;與操作&#xff08;方法&#xff09;**封裝在一起的用戶自定義類型&#xff0c;是面向對象編程的核心單元。 // 基礎類示例 class BankAccount { private: // 訪問控制string owner; …

介紹 Docker 的基本概念和優勢,以及在應用程序開發中的實際應用及數組講解

Docker 是一種輕量級的容器化技術&#xff0c;能夠讓開發者將應用程序和其所有依賴項打包成一個獨立的容器&#xff0c;實現快速部署和運行。以下是 Docker 的基本概念和優勢&#xff1a; 基本概念&#xff1a; 鏡像&#xff08;Image&#xff09;&#xff1a;鏡像是一個只讀的…