QHTTP详解
来源:互联网 发布:nginx 配置 80端口 编辑:程序博客网 时间:2024/06/05 07:11
QHttp是Qt所提供有关网络的高阶API,可以协助我们进行HTTP协议的进行,QHttp发出请求时是非同步的,请求的过程中会发出相关的Signal,我们可以用Slot来接收这些Signal,并进行相关的处理。
这个HttpGet可以让我们指定文件的URL地址,以HTTP方式取得文件并存储在本地,URL在Qt中以QUrl代表,当文件下载完成时,会发出finished()的Signal,当QHttp所指定的全部请求完成时,会发出done()的Signal,HTTPGet类中自定义的Slot就是用来接收QHttp的done() Signal以进行相关处理的,这可以在HttpGet的实现中看到
Qt的QHttp与QFtp在使用上有许多类似的地方,可以在以上的实例中看到一些特性,以下整理出相关的特性:
1) 非阻塞行为,请求时非同步的。
2) 我们可以设定一连串的请求,每个请求都有一个Command ID,QHttp的requestStarted()与requestFinished()等Signal会带有请求的Command ID,我们可以用以追踪骑请求的执行。
3) 在数据传输过程中,有相关的Signal可以追踪进度,像是QHttp的dataReadProgress()、dataSendProgress()等Signal。
4) 支援QIODevice的写入和读取,还有以QByteArray为基础的API。
url
统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。
URL的一般格式为(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
以下先示范一个最基本的QHttp使用,程序将设计一个HttpGet类:
HttpGet.h
Cpp代码
#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:
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的网络组件:
Cpp代码
1. QT += network
QT += network
当调用HttpGet类的downloadFile()方法时,程序中使用QUrl的path()来取得路径信息,如果路径信息中没有包括文件名,就使用预设的"index.html"作为请求的对象及下载后存档时的文件名,要使用QHttp来请求文件时,必须使用setHost()来设定主机及端口号信息,接着使用get()方法发出请求,并通知下载的文件要到哪个QFile来存储。
当QHttp所有请求处理完毕后,会发出done()的Signal,程序中将之连接到HttpGet的done()来处理,处理完成后再发出finished的Signal。
以下是个测试类:
Cpp代码
#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();
}
在<<C++ GUI Programming With Qt4>>这本书的第十四章介绍了用QHttp::get()函数去下载一个网页数据。但是这个例子只能处理常规的下载,也就是实现http请求中的“GET”请求,而不能实现”POST”请求。举例来说就是,QHttp::get()
能够下载 http://www.google.com/index.html
而不能下载 http://www.cuteqt.com/blog/?feed=rss
因为后者需要的下载方式不一样,可以用另外一个函数QHttp::request()来实现。
假如我们要执行上面第二个地址的请求,写出来的代码应该是下面的样子。
34 http.setHost("www.cuteqt.com/blog");
35 rssfile.setFileName("./feed.list");
36 rssfile.open(QIODevice::WriteOnly | QIODevice::Truncate);
37 QByteArray inputStr("feed=rss");
38 QHttpRequestHeader header("POST", "/blog/");
39 header.setValue("Content-Type", "application/x-www-form-urlencoded");
40 header.setValue("Host", "www.cuteqt.com/blog");
41 requestid=http.request(header,inputStr,&rssfile);
42 http.close();
34:http是QHttp 类型的,设置好要访问的主机
35:rssfile是QFile类型,下载的网页会存放到这个文件里
37:这个inputStr就是我们查询的串,格式可以是key1=var1&key2=var2&key3=var3的格式
38:设置好主机下的请求路径
40:header里的Host值,还是这个主机名
41:前面配置好的参数,正式发出请求,第三个参数类型是QIODevice *,如果不想存到文件里,你也可以用QBuffer。返回值requestid的作用下面会提到。
http.close();
需要注意的是,QHttp中不管是get()还是request()都是异步请求,也就是命令发出后,随即返回。在数据处理完毕的时候会有SIGNAL信号发出。request()处理完毕的信号名叫SIGNAL(requestFinished(int id,bool)),第一个参数id正是和前面request返回的requestid,以此知道是哪一个http请求处理后的返回消息。用以下函数关联信号和槽
connect(&http, SIGNAL(requestFinished(int,bool)), this, SLOT(httpReqDone(int,bool)));
通用代码如下:
QList<QPair<QByteArray, QByteArray> > querylist;
querylist=url.encodedQueryItems();//返回Query String of URL.
if(querylist.size()!=0)
{
QByteArray querydata;
querydata.append(querylist[0].first);
querydata.append('=');
querydata.append(querylist[0].second);
for (int i = 1; i < querylist.size(); ++i) {
querydata.append('&');
querydata.append(querylist[i].first);
querydata.append('=');
querydata.append(querylist[i].second);
}
QHttpRequestHeader header("POST", url.path());
header.setValue("Content-Type", "application/x-www-form-urlencoded");
header.setValue("Host", url.host());
http.setHost(url.host());
http_request_id=http.request(header,querydata,&file);
qDebug()<<querydata;
http.close();
}
else
{
http.setHost(url.host(), url.port(80));
http.get(url.path(), &file);
http_request_id=0;
http.close();
}
- QHTTP详解
- QHttp详解
- QT Http GET POST QHttp详解
- QHttp相关
- 关于QHttp
- 发现QHttp一个bug
- Qt类Qhttp
- QHttp realize breakpoint continuingly
- QT QHttp 访问 WEBSERVICE 范例
- QT QHttp 访问 WEBSERVICE 范例
- QHttp get的小例子
- 关于QHttp编程的一些笔记(转)
- 使用qftp或者qhttp下载文件
- 如何用QHttp实现同步服务
- Qt中调用QHttp类出错
- Qt中使用QHttp连接网站服务器,并传递参数(使用QHttp::request()函数实现)
- 关于Qt中QNetworkAccessManager如何取代QHttp的问题
- 使用QHttp下载网络文件的简单例子
- 使用doxygen为C/C++程序生成中文文档
- 关于Ext.PagingToolbar不显示displayMsg,emptyMsg问题
- Linux Crontab:15 Awesome Cron Job Examples
- boost sp 2 regex语法规范 正则表达式
- 5. 初学Java多线程:join方法的使用
- QHTTP详解
- 关于SQL中Function 递归的小计
- VS 2005 设置背景色
- 修改Hashtable的排序方法
- .NET简谈——跨进高级编程门槛的必经之路
- QHttp详解
- 简单就是美
- 警告: Parameters: Invalid chunk ignored.
- 球面化算法的研究