使用Qt类实现http协议get和post请求
//BaseHttpAPI.h
#pragma once
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
class BaseHttpAPI : public QObject
{
Q_OBJECT
public:
BaseHttpAPI(QObject* parent = nullptr);
~BaseHttpAPI();
void get(const QString& url);
void synGet(const QString& url);
void synPost(const QString& url, const QByteArray& data);
void post(const QString& url, const QByteArray& data);
signals:
void sigRequestFinished(QString url);
public slots:
void serviceRequestFinished(QNetworkReply* reply);
private:
QNetworkRequest _httpRequest;
QNetworkAccessManager _networkAccessMgr;
QNetworkReply* _reply;
QString _url;
QByteArray _data;
int _statusCode;
};
//BaseHttpAPI.cpp
#include "BaseHttpAPI.h"
#include <QDebug>
#include <QEventLoop>
#include <QMessageBox>
BaseHttpAPI::BaseHttpAPI(QObject* parent)
: QObject(parent)
{
QObject::connect(&_networkAccessMgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
}
BaseHttpAPI::~BaseHttpAPI()
{
}
void BaseHttpAPI::get(const QString& url)
{
_httpRequest.setUrl(QUrl(url));
QNetworkReply* reply = _networkAccessMgr.get(_httpRequest);
}
void BaseHttpAPI::synGet(const QString& url)
{
qDebug() << url;
_httpRequest.setUrl(QUrl(url));
QNetworkReply* reply = _networkAccessMgr.get(_httpRequest);
QEventLoop eventLoop;
connect(&_networkAccessMgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
eventLoop.exec(); //block until finish
disconnect(&_networkAccessMgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
}
void BaseHttpAPI::synPost(const QString& url, const QByteArray& data)
{
qDebug() << url << QString(data);
_httpRequest.setHeader(QNetworkRequest::ContentLengthHeader, data.size());
_httpRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
_httpRequest.setUrl(QUrl(url));
QNetworkReply* reply = _networkAccessMgr.post(_httpRequest, data);
QEventLoop eventLoop;
connect(&_networkAccessMgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
eventLoop.exec(); //block until finish
disconnect(&_networkAccessMgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
}
void BaseHttpAPI::post(const QString& url, const QByteArray& data)
{
_httpRequest.setHeader(QNetworkRequest::ContentLengthHeader, data.size());
_httpRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
_httpRequest.setUrl(QUrl(url));
QNetworkReply* reply = _networkAccessMgr.post(_httpRequest, data);
}
void BaseHttpAPI::serviceRequestFinished(QNetworkReply* reply)
{
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if (reply->error() == QNetworkReply::NoError)
{
_url = reply->url().url();
_reply = reply;
_data = reply->readAll();
_statusCode = statusCode;
//qDebug() << "reply data:" << _reply;
//qDebug() << "reply data:" << _data;
//qDebug() << "reply data:" << _statusCode;
}
else
{
_reply = nullptr;
_data = QByteArray();
_statusCode = 0;
}
emit sigRequestFinished(reply->url().toString());
reply->deleteLater();
}