QHttp是Qt所提供有关网络的高阶API,可以协助我们进行HTTP协议的进行,QHttp发出请求时是非同步的,请求的过程中会发出相关的Signal,我们可以用Slot来接收这些Signal,并进行相关的处理。
以下先示范一个最基本的QHttp使用,程序将设计一个HttpGet类:
HttpGet.h
#ifndef HTTPGET_H
#define HTTPGET_H
#include <QObject>
class QUrl;
class QHttp;
class QFile;
class HttpGet : public QObject {
Q_OBJECT
public:
HttpGet(QObject *parent = 0);
void downloadFile(const QUrl &url);
signals:
void finished();
private slots:
void done(bool error);
private:
QHttp *http;
QFile *file;
};
#endif
这个HttpGet可以让我们指定文件的URL地址,以HTTP方式取得文件并存储在本地,URL在Qt中以QUrl代表,当文件下载完成时,会发出finished()的Signal,当QHttp所指定的全部请求完成时,会发出done()的Signal,HTTPGet类中自定义的Slot就是用来接收QHttp的done() Signal以进行相关处理的,这可以在HttpGet的实现中看到:
HttpGet.cpp:
#include <QtNetwork>
#include <QFile>
#include <iostream>
#include "HttpGet.h"
using namespace std;
HttpGet::HttpGet(QObject *parent) : QObject(parent)
{
http = new QHttp(this);
connect(http, SIGNAL(done(bool)), this, SLOT(done(bool)));
}
void HttpGet::downloadFile(const QUrl &url)
{
QFileInfo fileInfo(url.path());
QString fileName = fileInfo.fileName();
if(fileName.isEmpty())
{
fileName = "index.html";
}
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
cerr<<"Unable to save the file"<<endl;
delete file;
file = 0;
return;
}
http->setHost(url.host(), url.port(80));
http->get(url.path(), file);
http->close();
}
void HttpGet::done(bool error)
{
if(error)
{
cerr<<"Error: "<<qPrintable(http->errorString())<<endl;
}
else
{
cerr<<"File downloaded as "<<qPrintable(file->fileName())<<endl;
}
file->close();
delete file;
file = 0;
emit finished();
}
要使用Qt的网络相关类必须引进QtNetwork,并且必须在pro文件中加入以下这行以在构建过程中使用Qt的网络组件:
QT += network
当调用HttpGet类的downloadFile()方法时,程序中使用QUrl的path()来取得路径信息,如果路径信息中没有包括文件名,就使用预设的"index.html"作为请求的对象及下载后存档时的文件名,要使用QHttp来请求文件时,必须使用setHost()来设定主机及端口号信息,接着使用get()方法发出请求,并通知下载的文件要到哪个QFile来存储。
当QHttp所有请求处理完毕后,会发出done()的Signal,程序中将之连接到HttpGet的done()来处理,处理完成后再发出finished的Signal。
以下是个测试类:
#include <QCoreApplication>
#include <QUrl>
#include "HttpGet.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
HttpGet getter;
getter.downloadFile(QUrl("Http:\\www.iprai.com/index.html"));
QObject::connect(&getter, SIGNAL(finished()), &app, SLOT(quit()));
return app.exec();
}
程序中将HttpGet的finished()的Signal连接到QCoreApplication的quit(),如此当下载文件完成后,可以直接关闭程序。
Qt的QHttp与QFtp在使用上有许多类似的地方,可以在以上的实例中看到一些特性,以下整理出相关的特性:
1) 非阻塞行为,请求时非同步的。
2) 我们可以设定一连串的请求,每个请求都有一个Command ID,QHttp的requestStarted()与requestFinished()等Signal会带有请求的Command ID,我们可以用以追踪骑请求的执行。
3) 在数据传输过程中,有相关的Signal可以追踪进度,像是QHttp的dataReadProgress()、dataSendProgress()等Signal。
4) 支援QIODevice的写入和读取,还有以QByteArray为基础的API。
分享到:
相关推荐
使用Qt库提供的QHttp下载给定网页的内容。
QT5中使用QHttp类.rar 在QT5中使用了QT4中的QHttp类的可以下载试试
QHttp是Qt所提供有关网络的高阶API
适用于QT5的QHttp类源码,QHttp是Qt所提供有关网络的高阶API。
QHTTP类库,在Qt4.x中的类库,但是在Qt5.x版本中被抛弃掉了,有需要的同学,可以直接加载到工程中使用。
qhttp:Qt5和c ++ 14中的轻量级异步HTTP库(服务器和客户端)
从Qt 5.0 版本开始, 删除了QHttp 和 QFtp 类, 通过QNetworkReplyQNetworkAccessManager、QNetworkRequest类实现基于HTTP和FTP协议的应用程序。除了HTTP和FTP协议外, 该类还可以实现高层(OSI 7层中的上层)网络应用...
基于网上开源库写的一个http serive 的例子,如有问题,可加
Quectel_EC200x&EG912Y&EC600S系列_HTTP(S)_应用指导_V1.0_Preliminary_20200915.pdf
刚刚用qt写开始写网络文件下载,碰到不少困难,终于完成了个测试版本,可以测试断点下载,动态网址好像不行,只能全部下载。 不幸的是写好了,现在源代码已经不见了,还好有个测试模块,要的就拿了,可以满足一般...
SignCode=$qSignTools\signtool.exe$q sign /f $qCerts\[Certificate].pfx$q -d $q[Software Name or Company]$q -du $q[http://www.mydomainhost.com]$q /t $qhttp://timestamp.comodoca.com/authenticode$q $f ...
QHttp协议下载网络文件、图片等,并自动保存本地文件夹。
Qt实现的一个下载管理器,使用的是QHttp方式下载,有源码
QT实现的http GET POST操作 #include #include #include <QtNetwork/QHttp> #include #include <QtNetwork/QHttpRequestHeader>
QHttp服务器Qt HTTP 服务器 - 因为核心程序员用 C++ 编写网络应用程序 :) 它使用 Joyent 的并且是异步的,不需要任何继承。 QHttpServer 在 MIT 许可下可用。 注意:QHttpServer 现在不完全符合 HTTP 标准! 不要将...
本来想简单抄抄书,随便手写个Ftp客户端的,结果发现教材上的是基于Qt4的QFtp类库,而在Qt5中取消了这一个类库(同时也取消了QHttp等的类),取而代之的是QNetworkAccessManager 这个类,把这些杂货全都揽下来了,...
Boost C ++库t qhttp服务器BoostConnect(git子调制为./lib/boostconnect)执行方式启动QtCreator之后,构建所有项目。 启动从属服务器并进行适当的设置。当一起发送多个从属答案时,请启动主服务器并进行适当的...
最近做文件上传,用QNetWorkAccessManager post函数上传文件,总是行不通,最后放弃了。...遂分享给网友。 不知道post函数是不是不能上传文件呢,为啥我就是无法实现呢,有实现的可以交流一下,不胜感激!...