基于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.pswp.cn/pingmian/80506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80506.shtml
英文地址,請注明出處:http://en.pswp.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博客