此代码应该是从Github上借鉴过来的类,封装的不错,可以直接使用get和post请求。也可以实现一些简单的下载请求。
NetworkHelper.h
#ifndef NetworkHelper_h_
#define NetworkHelper_h_
#include <QObject>
#include <QNetworkReply>
#include <QTimer>
#define LimitTimeOut 5000 //请求超时时间(毫秒)
enum E_NetworkReply
{
E_NetOK,
E_NetTimeOut,//超时
E_NetReplyError,
};
typedef void (*ReceiveFun)(int errCode, const QByteArray& bytes, void* pCusData);
class NetworkHelper : public QObject
{
Q_OBJECT
public:
static void get(const QString& url, ReceiveFun receiver, void* data, int timeout = LimitTimeOut);
static void post(const QString& url, const QString& content, ReceiveFun receiver, void* data, int timeout = LimitTimeOut);
static void postJson(const QString& url, const QString& content, ReceiveFun receiver, int timeout = LimitTimeOut);
private slots:
void OnReplyFinished(QNetworkReply* reply);
void OnTimer();
private:
NetworkHelper(QString url, QString content, ReceiveFun receiver, void* pCusData, int timeout);
~NetworkHelper();
void excuteGet();
void excutePost();
void excutePostJson();
private:
QNetworkAccessManager* m_pNetworkAccessManager;
QTimer* m_pTimer;
QString m_url;
QString m_content;
ReceiveFun m_receiver;
void* m_pCusdata;
int m_timeout;
};
#endif//NetworkHelper_h_
NetworkHelper.cpp
#include "stdafx.h"
#include "NetworkHelper.h"
NetworkHelper::NetworkHelper(QString url, QString content, ReceiveFun receiver, void* pCusData, int timeout)
{
m_url = url;
m_content = content;
m_receiver = receiver;
m_pCusdata = pCusData;
m_timeout = timeout;
m_pNetworkAccessManager = new QNetworkAccessManager();
m_pTimer = new QTimer();
connect( m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(OnReplyFinished(QNetworkReply*)) );
connect( m_pTimer, SIGNAL(timeout()), this, SLOT(OnTimer()) );
}
NetworkHelper::~NetworkHelper()
{
SafeDelete(m_pNetworkAccessManager);
SafeDelete(m_pTimer);
}
void NetworkHelper::get( const QString& url, ReceiveFun receiver, void* data, int timeout /*= LimitTimeOut*/ )
{
NetworkHelper* p = new NetworkHelper( url, "", receiver, data, timeout );
p->excuteGet();
}
void NetworkHelper::post( const QString& url, const QString& content, ReceiveFun receiver, void* data, int timeout /*= LimitTimeOut*/ )
{
NetworkHelper* p = new NetworkHelper( url, content ,receiver, data, timeout );
p->excutePost();
}
void NetworkHelper::postJson(const QString& url, const QString& content, ReceiveFun receiver, int timeout /*= LimitTimeOut*/)
{
NetworkHelper* p = new NetworkHelper(url, content, receiver, NULL, timeout);
p->excutePostJson();
}
void NetworkHelper::OnReplyFinished( QNetworkReply* reply )
{
m_pTimer->stop();
if (reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll();
if (m_receiver)
{
m_receiver(E_NetOK, bytes, m_pCusdata);
}
}
else
{
if (m_receiver)
{
m_receiver(E_NetReplyError, QByteArray(), m_pCusdata);
}
QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qDebug( "found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
qDebug( qPrintable(reply->errorString()) );
}
reply->deleteLater();
this->deleteLater();
}
void NetworkHelper::OnTimer()
{
m_pTimer->stop();
if (m_receiver)
{
m_receiver( E_NetTimeOut, QByteArray(), m_pCusdata ); //超时
}
this->deleteLater();
}
void NetworkHelper::excuteGet()
{
QNetworkRequest network_request;
network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//二进制流类型
network_request.setUrl( QUrl(m_url) );
m_pNetworkAccessManager->get(network_request);
m_pTimer->start(m_timeout);
}
void NetworkHelper::excutePost()
{
QNetworkRequest network_request;
network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//二进制流类型
network_request.setUrl( QUrl(m_url) );
QByteArray post_data;
post_data.append(m_content);
m_pNetworkAccessManager->post(network_request, post_data);
m_pTimer->start(m_timeout);
}
void NetworkHelper::excutePostJson()
{
qDebug("~> excutePostJson() url: %s, content: %s", m_url, m_content);
QNetworkRequest network_request;
network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=utf-8");
network_request.setUrl(QUrl(m_url));
//m_content = m_content.toUtf8();
QByteArray post_data;
post_data.append(m_content);
m_pNetworkAccessManager->post(network_request, post_data);
m_pTimer->start(m_timeout);
}
用法例子:
void MainClass::Test()
{
NetworkHelper::get(url, [](int errCode, const QByteArray& bytes, void* pCusData)
{
if(errCode == E_NetOK)
{
QString platformData = bytes;
QLOG << platformData;
#if 0 //下载图片用此
QFile file("D:\\test.png");
if (file.open(QIODevice::WriteOnly | QIODevice::Append))
{
file.write(bytes);
}
file.close();
#endif
//这里之所以要在回调函数中将主类的指针传过来,是因为经过请求后的数据,异步跨线程了
MainClass* pThis = reinterpret_cast<MainClass*>(pCusData);
pThis->doSth(platformData);
}
}, this, 2000);
}