nt头文件:
// http.h
#ifndef HTTP_H
#define HTTP_H
#include <QObject>
#include <QBuffer>
#include <QHttp>
#include <QUrl>
class Http: public QObject
{
Q_OBJECT
public:
Http(QObject *parent = 0);
~Http();
void setUrl(const QUrl &url);
void setPort(quint16 port);
void get();
void post(const QString &script);
bool error();
QByteArray read();
protected:
QHttp *http;
QUrl _url;
QBuffer reply;
quint16 _port;
int _id;
bool _error;
protected slots:
void requestStarted(int);
void requestFinished(int, bool);
void dataSendProgess(int, int);
void dataReadProgess(int, int);
void responseHeaderReceived();
signals:
void done();
}
#endif // HTTP_H
源文件:
// http.cpp
#include "http.h"
#include <iostream>
Http::Http(QObject *parent)
:QObject(parent)
{
http = new QHttp(this);
_port = 80;
connect(http,SIGNAL(requestStarted(int)),
this,SLOT(requestStarted(int)));
connect(http,SIGNAL(requestFinished(int,bool)),
this,SLOT(requestFinished(int,bool)));
connect(http,SIGNAL(dataSendProgress(int,int)),
this,SLOT(dataSendProgess(int,int)));
connect(http,SIGNAL(dataReadProgress(int,int)),
this,SLOT(dataReadProgess(int,int)));
}
Http::~Http()
{
delete http;
disconnect(this);
QObject::~QObject();
}
void Http::setUrl(const QUrl &url)
{_url = url;}
void Http::setPort(quint16 port)
{_port = port;}
void Http::get()
{
http->setHost(_url.host(),_port);
_id = http->get(_url.path(),&reply);
}
void Http::post(const QString &script)
{
http->setHost(_url.host(),_port);
_id = http->post(_url.path(),script,&reply);
}
bool Http::error()
{return _error;}
QByteArray Http::read()
{return reply;}
void Http::requestStarted(int id)
{
if (id != _id)
return;
std::cout << "正在连接至服务器"
<< qPrintable(_url.host())
<< " ..." << std::endl;
}
void Http::requestFinished(int id, bool error)
{
if (id != _id)
return;
std::cout << "正在断开与服务器"
<< qPrintable(_url.host())
<< "的连接 ..." << std::endl;
if (!error)
std::cout << "成功与"
<< qPrintable(_url.host())
<< "交换数据" << std::endl;
else
{
switch (http->error())
{
case QHttp::HostNotFound: std::cerr << "找不到指定服务器"
<< qPrintable(_url.host())
<< std::endl;break;
case QHttp::ConnectionRefused: std::cerr << "服务器"
<< qPrintable(_url.host())
<< "拒绝连接请求" << std::endl;break;
case QHttp::UnexpectedClose: std::cerr << "与服务器"
<< qPrintable(_url.host())
<< "的连接被服务器意外地关闭" << std::endl;break;
case QHttp::InvalidResponseHeader: std::cerr << "响应文件"
<< qPrintable(_url.path())
<< "无效" << std::endl;break;
case QHttp::WrongContentLength: std::cerr << "数据长度失效" << std::endl;break;
case QHttp::Aborted: std::cerr << "与服务器"
<< qPrintable(_url.host())
<< "的连接突然中断" << std::endl;break;
case QHttp::ProxyAuthenticationRequiredError: std::cerr << "与代理服务器的连接需要身份验证" << std::endl;
case QHttp::AuthenticationRequiredError: std::cerr << "与服务器"
<< qPrintable(_url.host())
<< "的连接需要身份验证" << std::endl;break;
default: std::cerr << "发生了一个未知错误" << std::endl;break;
}
}
}
void Http::dataSendProgess(int done, int total)
{
std::cout << "正在向服务器"
<< qPrintable(_url.host())
<< "发送数据 ..." << std::endl
<< "总数据大小: " << total << "KB" << std::endl
<< "已发送数据大小: " << done << "KB" << std::endl
<< "待发送数据大小: " << total-done << "KB" << std::endl
<< "已发送数据占比: " << 100*done/total << "%" << std::endl
<< "待发送数据占比: " << 100-100*done/total << "%" << std::endl;
}
void Http::dataReadProgess(int done, int total)
{
std::cout << "正在从服务器"
<< qPrintable(_url.host())
<< "接受数据 ..." << std::endl;
if (total)
std::cout << "总数据大小: " << total << std::endl;
std::cout << "已接受数据大小: " << done << std::endl;
if (total)
std::cout << "待接收数据大小: " << total-done << std::endl
<< "已接受数据占比: " << 100*done/total << "%" << std::endl
<< "待接受数据占比: " << 100-100*done/total << "%" << std::endl;
}
代码自己理解吧,这里发一个QHttp帮助文档的链接,可以自己去看一看,不过是全英文的,可以用浏览器翻译。这里给出一张post
过程的流程图。