QHttp

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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值