Target
纯Qt实现Http Get/Post协议:
- Block模式
- 支持超时取消功能
- 可自定义Header
Code
NetTool.h
#ifndef NETTOOL_H
#define NETTOOL_H
#include <QObject>
#include <QtNetwork>
#include <QMap>
class NetTool : public QObject
{
Q_OBJECT
public:
explicit NetTool(QObject *parent = nullptr);
QByteArray Http_Get(QString strUrl, QMap<QString,QString> headers=QMap<QString,QString>(), int nTimeout_ms=9000);
QByteArray Http_Post(QString strUrl, QByteArray bData, QMap<QString,QString> headers=QMap<QString,QString>(), int nTimeout_ms=9000);
// Default Coding UTF8
QJsonDocument Http_Get_JSON(QString strUrl, int nTimeout_ms=9000);
QJsonDocument Http_Post_JSON(QString strUrl, QByteArray bData, int nTimeout_ms=9000);
// member
QNetworkAccessManager* m_pNetMgr;
signals:
public slots:
};
#endif // NETTOOL_H
NetTool.cpp
#include "nettool.h"
/*
* 5.13版之后 TLS initialization failed 解决办法:
* C:\Qt\Qt5.14.1\Tools\QtCreator\bin 下的libssl-1_1.dll 各 libcrypto-1_1.dll 拷贝到 C:\Qt\Qt5.14.1\5.14.1\mingw73_32\bin 目录下
*/
NetTool::NetTool(QObject *parent) : QObject(parent)
{
// 对于多线程场合,需要将QNetworkAccessManager 与 QNetworkReply 放在同一线程执行
m_pNetMgr = new QNetworkAccessManager(this);
m_pNetMgr->setProxy(QNetworkProxy::NoProxy);
}
QByteArray NetTool::Http_Get(QString strUrl, QMap<QString,QString> headers, int nTimeout_ms)
{
QUrl url = QUrl::fromUserInput(strUrl);
QNetworkRequest qnr(url);
qnr.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41");
qnr.setRawHeader("Content-type","text/html; charset=utf-8");
if( headers.count() > 0 ){
foreach (QString key, headers.keys() ) {
qnr.setRawHeader(key.toUtf8(), headers.value(key).toUtf8());
}
}
// setRawHeader("Content-Type","application/json; charset=utf-8");
// setRawHeader("Accept","application/json");
// .setRawHeader("Authorization", "Basic YWRtaW46MTIzNDU3");
QSslConfiguration cfg = qnr.sslConfiguration();
cfg.setPeerVerifyMode(QSslSocket::VerifyNone);
cfg.setProtocol(QSsl::AnyProtocol);
qnr.setSslConfiguration(cfg);
QNetworkReply* reply = m_pNetMgr->get(qnr);
QEventLoop eventLoop;
QTimer::singleShot(nTimeout_ms, reply, &QNetworkReply::abort);
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
// Error
if( reply->error() != 0 ){
qDebug()<<"HTTP Get"<<strUrl<<"Error:"<<reply->errorString();
return QByteArray();
}
// Code
QVariant code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if( code != 200 ){
qDebug()<<"HTTP Get "+strUrl+ "status code:"<<code;
return QByteArray();
}
// OK
QByteArray replyData = reply->readAll();
reply->close();
reply->deleteLater();
reply = nullptr;
return replyData;
}
QByteArray NetTool::Http_Post(QString strUrl, QByteArray bData, QMap<QString,QString> headers, int nTimeout_ms)
{
QUrl url = QUrl::fromUserInput(strUrl);
QNetworkRequest qnr(url);
qnr.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41");
qnr.setRawHeader("Content-type","text/html; charset=utf-8");
if( headers.count() > 0 ){
foreach( QString key, headers.keys() ) {
qnr.setRawHeader(key.toUtf8(), headers.value(key).toUtf8());
}
}
QSslConfiguration cfg = qnr.sslConfiguration();
cfg.setPeerVerifyMode(QSslSocket::VerifyNone);
cfg.setProtocol(QSsl::AnyProtocol);
qnr.setSslConfiguration(cfg);
QNetworkReply* reply = m_pNetMgr->post(qnr, bData);
QEventLoop eventLoop;
QTimer::singleShot(nTimeout_ms, reply, &QNetworkReply::abort);
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
// Error
if( reply->error() != 0 ){
qDebug()<<"HTTP Post"<<strUrl<<"Error:"<<reply->errorString();
return QByteArray();
}
// Code
QVariant code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if( code != 200 ){
qDebug()<<"HTTP Post "+strUrl+ "status code:"<<code;
return QByteArray();
}
// OK
QByteArray replyData = reply->readAll();
reply->close();
reply->deleteLater();
reply = nullptr;
return replyData;
}
QJsonDocument NetTool::Http_Get_JSON(QString strUrl, int nTimeout_ms)
{
// Default coding UTF8
QMap<QString,QString> headers;
headers.insert("Content-Type","application/json; charset=utf-8");
headers.insert("Accept","application/json");
QByteArray buff = Http_Get(strUrl, headers, nTimeout_ms);
return QJsonDocument::fromJson(buff);
}
QJsonDocument NetTool::Http_Post_JSON(QString strUrl, QByteArray bData, int nTimeout_ms)
{
// Default coding UTF8
QMap<QString,QString> headers;
headers.insert("Content-Type","application/json; charset=utf-8");
headers.insert("Accept","application/json");
QByteArray buff = Http_Post(strUrl, bData, headers, nTimeout_ms);
return QJsonDocument::fromJson(buff);
}
使用:
auto val = myTool->Http_Get_JSON(ui->lineEdit->text());
ui->textEdit->setText(QString::fromUtf8(val.toJson()));
qDebug()<<val;
auto val = myTool->Http_Get(ui->lineEdit->text());
ui->textEdit->setText(QString::fromUtf8(val));
qDebug()<<val;