QT网络编程之Http

一、HTTP概述

HTTP(超文本传输协议)是互联网上应用最为广泛的协议之一,它定义了客户端和服务器之间进行通信的规则。HTTP是一种无状态的协议,它通过请求-响应模型来实现客户端和服务器之间的数据传输。

二.QT中的HTTP类

在Qt中,用于进行HTTP通信的类是QNetworkAccessManager类和相关的类。QNetworkAccessManager提供了一个用于发送网络请求和接收网络响应的高层API,它基于Qt的网络模块实现。

以下是一些与HTTP通信相关的类和其主要功能:

QNetworkAccessManager类:

该类用于发送HTTP请求和接收HTTP响应。

可以发起GET、POST、PUT、DELETE等各种类型的请求。

提供了信号和槽机制,允许处理请求的完成、错误和响应等事件。

支持同步和异步方式发送请求。

QNetworkRequest类:

表示一个HTTP请求。

可以设置请求的URL、请求头、请求方法等属性。

可以添加自定义的请求头字段。

QNetworkReply类:

表示一个HTTP响应。

提供了获取响应状态码、响应头、响应正文等信息的方法。

可以通过该类获取服务器返回的数据。

QNetworkCookieJar类:

用于管理和存储HTTP请求和响应中的Cookie。

可以设置和获取Cookie,并将其与请求关联起来。

这些类的组合使用可以实现在Qt应用程序中进行HTTP通信的功能。以下是一个简单的示例代码,演示如何使用QNetworkAccessManager发送GET请求并处理响应:

三.使用HTTP类请求数据

使用HTTP类请求数据步骤:

1.使用QNetworkAccessManager类创建网络访问管理器

2.使用QNetworkRequest创建请求对象

3.使用QNetworkReply发出GET请求(在请求完成后一定要记得使用deleteLater来清理释放资源)

4.连接信号与槽得到数据

四.http下载文件代码示例

1.mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QNetworkAccessManager>

#include <QNetworkReply>

#include <QFile>

#include <QUrl>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

private:

QNetworkAccessManager networkManager;//网络管理

QNetworkReply *reply; //网络响应

QFile *downloadedFile;//下载保存的临时文件

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private slots:

//自定义槽函数

void on_finished();

void on_readyRead();

void on_downloadProgress(qint64 bytesRead, qint64 totalBytes);

void on_btnDefaultPath_clicked();

void on_btnDownload_clicked();

void on_editURL_textChanged(const QString &arg1);

private:

Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

2.mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDir>

#include <QMessageBox>

#include <QDesktopServices>

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

ui->editURL->setClearButtonEnabled(true);

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::on_finished()

{//网络响应结束

QFileInfo fileInfo;

fileInfo.setFile(downloadedFile->fileName());

downloadedFile->close();

delete downloadedFile;

downloadedFile = Q_NULLPTR;

reply->deleteLater(); //

reply = Q_NULLPTR;

if (ui->checkOpen->isChecked())//打开下载的文件

QDesktopServices::openUrl(QUrl::fromLocalFile(fileInfo.absoluteFilePath()));

ui->btnDownload->setEnabled(true);

}

void MainWindow::on_readyRead()

{//读取下载的数据

downloadedFile->write(reply->readAll());

}

void MainWindow::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)

{//下载进程

ui->progressBar->setMaximum(totalBytes);

ui->progressBar->setValue(bytesRead);

}

void MainWindow::on_btnDefaultPath_clicked()

{//缺省路径 按钮

QString curPath=QDir::currentPath();

QDir dir(curPath);

QString sub="temp";

dir.mkdir(sub);

ui->editPath->setText(curPath+"/"+sub+"/");

}

void MainWindow::on_btnDownload_clicked()

{//开始下载 按钮

QString urlSpec = ui->editURL->text().trimmed();

if (urlSpec.isEmpty())

{

QMessageBox::information(this, "错误",

"请指定需要下载的URL");

return;

}

QUrl newUrl = QUrl::fromUserInput(urlSpec);//URL地址

if (!newUrl.isValid())

{

QMessageBox::information(this, "错误",

QString("无效URL: %1 \n 错误信息: %2").arg(urlSpec, newUrl.errorString()));

return;

}

QString tempDir =ui->editPath->text().trimmed();//临时目录

if (tempDir.isEmpty())

{

QMessageBox::information(this, tr("错误"), "请指定保存下载文件的目录");

return;

}

QString fullFileName =tempDir+newUrl.fileName(); //文件名

if (QFile::exists(fullFileName))

QFile::remove(fullFileName);

downloadedFile =new QFile(fullFileName);//创建临时文件

if (!downloadedFile->open(QIODevice::WriteOnly))

{

QMessageBox::information(this, tr("错误"),"临时文件打开错误");

return;

}

ui->btnDownload->setEnabled(false);

//发送玩过请求,创建网络响应

reply = networkManager.get(QNetworkRequest(newUrl));

connect(reply, SIGNAL(finished()), this, SLOT(on_finished()));

connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead()));

connect(reply, SIGNAL(downloadProgress(qint64,qint64)),

this, SLOT(on_downloadProgress(qint64,qint64)));

}

void MainWindow::on_editURL_textChanged(const QString &arg1)

{

Q_UNUSED(arg1);

ui->progressBar->setMaximum(100);

ui->progressBar->setValue(0);

}

3.测试结果

本机搭建一个文件服务器,然后进行文件下载测试:

相关推荐
艾芯微科技13 分钟前
DMG2305UX-13|Diodes 20V/5A P 沟道 SOT-23 MOS 管参数、电路应用、替代与丝印避坑
网络·单片机·嵌入式硬件·集成测试·51单片机
国科安芯1 小时前
3 Ω 还是 5.5 Ω:ASL3157S 的供电电压、导通电阻与双路一致性怎么算
网络·嵌入式硬件·安全·模拟开关·抗辐射
持敬chijing1 小时前
系统入侵与攻击工具-namp扫描方式与内置脚本
网络·安全·网络安全·网络攻击模型·安全威胁分析
Escalating_xu1 小时前
【Linux 网络编程】传输层协议 UDP:从 8 字节首部到消息边界、缓冲区与 MTU
linux·网络·udp
紧跟先前的步伐2 小时前
Go AI Agent 实战 12|HTTP 状态码、API 错误处理与日志
开发语言·人工智能·http·ai·golang
byte轻骑兵2 小时前
【HIDS】规范精讲[3]:把连接间隔压到极限——SCI 四档调速的底层机制
网络·网络协议·人机交互·hids·蓝牙协议
骑着蜗牛撵大象3273 小时前
从三次握手到 epoll:C++ 写出可落地的 TCP Socket 服务端
网络·c++·tcp/ip·高并发·tcp·epoll
比兔代理3 小时前
静态 IP 的粘性会话原理,以及连接稳定性解析
网络·网络协议
Lsetea3 小时前
curl下载HTTPS正文是乱码:--compressed与Content-Encoding分层排查
linux·http·https·ssl证书·curl
刘胡子大叔4 小时前
curl resolve 和 Host 头的两种免 DNS 验证 HTTPS
网络协议·http·https