六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 62|回复: 0

QHttp

[复制链接]

升级  19.33%

19

主题

19

主题

19

主题

秀才

Rank: 2

积分
79
 楼主| 发表于 2013-2-7 15:39:06 | 显示全部楼层 |阅读模式
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_OBJECTpublic:       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。
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表