1. 程式人生 > >QT中Http的阻塞型Get和Post

QT中Http的阻塞型Get和Post

QT中實現http請求阻塞型(Http請求都在非GUI執行緒中)這個時候就可以用阻塞型,方便使用

一下程式碼都是驗證過的,包含.h和原始碼,時間超時等進行判斷

主要是阻塞型的時候需要各種設定

    do{
        QApplication::processEvents();//該執行緒的事件迴圈
        if(DiffTime(lasttime,GetTickCountSYS())>=m_TimeOut){
            m_pRelay->deleteLater();
            m_pNetworkAccessManager->
disconnect(); delete m_pNetworkAccessManager; m_pNetworkAccessManager = NULL; return false;//超時了 } }while(m_HtmlState != s_HTMLSTATE_END);//!m_pRelay->isFinished(),該標記完成的時候,不代表代表已經執行了槽

include “httpbase.h”

include

include “Bootloader/SYSInterface.h”

define _T(x) QString::fromLocal8Bit(##x##)

CHttpBase::CHttpBase()
{
/*
httpRequest.setRawHeader(“Accept”, API_ACCEPT);
httpRequest.setRawHeader(“User-Agent”, API_USER_AGENT);
httpRequest.setRawHeader(“X-XXX-API-Key”, API_KEY);
httpRequest.setRawHeader(“X-XXX-API-Secret”, API_SECRET);
httpRequest.setRawHeader(“Accept-Encoding”, “gzip, deflate”);
httpRequest.setRawHeader(“Content-Type”, “application/json”);

settings = new QSettings("XXX");
QString id = settings->value(SETTING_ACCOUNT_ID, "").toString();
QString token = settings->value(SETTING_ACCOUNT_TOKEN, "").toString();


if(!id.isEmpty()) {
    httpRequest.setRawHeader("X-XXX-User-ID", id.toStdString().c_str());
}


if (!token.isEmpty()) {
    httpRequest.setRawHeader("X-XXX-User-Token", token.toStdString().c_str());
}


qDebug() << "BaseAPI...id:" << id << " token:" + token;

*/
m_HtmlErrExplain.insert(0,_T(“No ERROR”));
m_HtmlErrExplain.insert(4,_T(“連線遠端伺服器超時”));
m_HtmlErrExplain.insert(201,_T(“遠端伺服器拒絕連線”));
m_HtmlErrExplain.insert(203,_T(“遠端伺服器不能發現”));
m_pNetworkAccessManager = NULL;
m_TimeOut = 3000;
}

CHttpBase::~CHttpBase()
{
if(m_pNetworkAccessManager){
m_pNetworkAccessManager->disconnect();
delete m_pNetworkAccessManager;
}
}
///進入時生命一個,退出時刪除,保證不同執行緒可以使用
bool CHttpBase::get(const QString url)
{
if(m_pNetworkAccessManager == NULL) m_pNetworkAccessManager = new QNetworkAccessManager();
m_HtmlState = s_HTMLSTATE_START;
QNetworkRequest httprequest;
httprequest.setHeader(QNetworkRequest::ContentTypeHeader,”application/x-www-form-urlencoded”);
QObject::connect(GetNetworkAccessManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
httprequest.setUrl(url);
m_pRelay = GetNetworkAccessManager()->get(httprequest);
DWORD lasttime = GetTickCountSYS();
do{
QApplication::processEvents();//該執行緒的事件迴圈
if(DiffTime(lasttime,GetTickCountSYS())>=m_TimeOut){
m_pRelay->deleteLater();
m_pNetworkAccessManager->disconnect();
delete m_pNetworkAccessManager;
m_pNetworkAccessManager = NULL;
return false;//超時了
}
}while(m_HtmlState != s_HTMLSTATE_END);//!m_pRelay->isFinished(),該標記完成的時候,不代表代表已經執行了槽
m_pNetworkAccessManager->disconnect();
delete m_pNetworkAccessManager;
m_pNetworkAccessManager = NULL;
return true;
}

bool CHttpBase::get(const QString url, int trytimes)
{
do{
if(get(url)) return true;
}while((trytimes–)>0);
return false;
}
bool CHttpBase::post(const QString url, const QByteArray &data)
{
if(m_pNetworkAccessManager != NULL){
m_pNetworkAccessManager->disconnect();
delete m_pNetworkAccessManager;
m_pNetworkAccessManager = NULL;
}
if(m_pNetworkAccessManager == NULL) m_pNetworkAccessManager = new QNetworkAccessManager();
m_HtmlState = s_HTMLSTATE_START;
QNetworkRequest httprequest;
httprequest.setHeader(QNetworkRequest::ContentTypeHeader,”application/x-www-form-urlencoded”);
QObject::connect(GetNetworkAccessManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
httprequest.setUrl(QUrl(url));
m_pRelay = GetNetworkAccessManager()->post(httprequest,data);
DWORD lasttime = GetTickCountSYS();
do{
QApplication::processEvents();//該執行緒的事件迴圈
if(DiffTime(lasttime,GetTickCountSYS())>=m_TimeOut){
m_pRelay->deleteLater();
m_pNetworkAccessManager->disconnect();
delete m_pNetworkAccessManager;
m_pNetworkAccessManager = NULL;
return false;//超時了
}
}while(m_HtmlState != s_HTMLSTATE_END);//該標記完成的時候,是否代表已經執行了槽
m_pNetworkAccessManager->disconnect();
delete m_pNetworkAccessManager;
m_pNetworkAccessManager = NULL;
return true;
//httpRequest.setUrl(QUrl(url));
// m_pRelay = networkAccessManager.post(httpRequest, data);
}

bool CHttpBase::post(const QString url, const QByteArray &data, int trytimes)
{
do{
if(post(url,data)) return true;
}while((trytimes–)>0);
return false;
}

QString CHttpBase::GetNetworkStateExplain(int statecode)
{
QMap

ifndef CHTTPBASE_H

define CHTTPBASE_H

include

include

include

include

include

include

include

include

class CHttpBase : public QObject
{
Q_OBJECT
public:
//explicit CHttpBase(QObject *parent = 0);
explicit CHttpBase();
~CHttpBase();
int m_HtmlState;/連線狀態/
static const int s_HTMLSTATE_END = 0;
static const int s_HTMLSTATE_START = 1;
unsigned long m_TimeOut;
bool get(const QString url);//false–>超時了
bool get(const QString url,int trytimes);//false–>超時了
bool post(const QString url, const QByteArray &data);//false->超時了
bool post(const QString url, const QByteArray &data,int trytimes);//false->超時了,trytimes–>0請求一次,1代表請求了2次
QString GetNetworkStateExplain(int statecode);
void TimeOutHandle();
QMap

endif // CHTTPBASE_H

“`