一、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.测试结果
本机搭建一个文件服务器,然后进行文件下载测试: