QT http请求数据
标签:value sock include config 文件 none errors verify add
1.创建一个请求类(HttpWork):
HttpWork.h头文件
#pragma once
#include
#include
#include
#include "NetWorkCookie.h"
#include class HttpWork : public QObject
{
Q_OBJECT
public:
HttpWork(QObject *parent,bool ssl=false,bool autoDelete = true);
~HttpWork();
void get(QString url,QString token="");
void post(QString url, QByteArray param, QString token = "");
private:
QNetworkAccessManager *m_pNetworkAccessManager;
NetworkCookie* m_pCookie;
bool m_bEnabelSSl;
bool m_bAutoDelete;
private slots:
void replyFinished(QNetworkReply *reply);
signals:
void sglResponse(QString err, QString data);
};
HttpWork.cpp源文件
#include "HttpWork.h"
#include
HttpWork::HttpWork(QObject *parent, bool ssl , bool autoDelete)
: QObject(parent)
, m_bEnabelSSl(ssl)
, m_bAutoDelete(autoDelete)
{
m_pNetworkAccessManager = new QNetworkAccessManager(this);
m_pCookie = new NetworkCookie(this);
connect(m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
HttpWork::~HttpWork()
{
}
void HttpWork::get(QString url,QString token)
{
QNetworkRequest request(url);
if (!token.isEmpty()) {
request.setRawHeader("authorization", token.toStdString().c_str());;
}
request.setRawHeader("Content-Type", "application/json");
m_pNetworkAccessManager->get(request);
}
void HttpWork::post(QString url, QByteArray param, QString token)
{
QNetworkRequest request(url);
if (!token.isEmpty()) {
request.setRawHeader("authorization", token.toStdString().c_str());;
}
if (m_bEnabelSSl) {
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfig.setProtocol(QSsl::TlsV1_2);
request.setSslConfiguration(sslConfig);
}
//设置cookie到浏览器
m_pNetworkAccessManager->setCookieJar(m_pCookie);
request.setRawHeader("Content-Type", "application/json");
request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
m_pNetworkAccessManager->post(request, param);
}
void HttpWork::replyFinished(QNetworkReply *reply)
{
int code = -1;
QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (variant.isValid()){
code = variant.toInt();
}
QString err;
QByteArray bytes;
if(reply->error() == QNetworkReply::NoError) {
QList cookies = m_pCookie->getCookies();
for (int i = 0; i ) {
QNetworkCookie cookie = cookies.at(i);
QString name = cookie.name();
QString value = cookie.value();
}
bytes = reply->readAll();
}
else {
err = reply->errorString()+"statusCode:"+code;
}
emit sglResponse(err, QString(bytes));
if (m_bAutoDelete) {
deleteLater();
}
}
NetworkCookie.h头文件
#pragma once
#include
#include class NetworkCookie : public QNetworkCookieJar
{
Q_OBJECT
public:
NetworkCookie(QObject *parent);
~NetworkCookie();
QList getCookies();
void setCookies(const QList& cookieList);
};
NetworkCookie.cpp源文件
#include "NetworkCookie.h"
NetworkCookie::NetworkCookie(QObject *parent)
: QNetworkCookieJar(parent)
{
}
NetworkCookie::~NetworkCookie()
{
}
QList NetworkCookie::getCookies()
{
return QNetworkCookieJar::allCookies();
}
void NetworkCookie::setCookies(const QList& cookieList)
{
this->setAllCookies(cookieList);
}
需要http请求数据的时候调用:
void ServerAPI::login(QString address, int port, QString user, QString passwd)
{
m_sAddress = address;
m_nPort = port;
m_sUser = user;
m_sHost = QString("http%1://%2:%3").arg(m_nPort == 443 ? "s" : "").arg(address).arg(port);
HttpWork* worker;
worker = new HttpWork(this, m_nPort == 443);
connect(worker, SIGNAL(sglResponse(QString, QString)), this, SLOT(sltOnReponseLogin(QString, QString)));
QByteArray append = QString("type=1&account_or_mobile=%1&pwd_or_checkCode=%2").arg(user).arg(passwd).toUtf8();
worker->post(m_sHost + "/admin-api/v1/user-manage/login", append);
}
void ServerAPI::sltOnReponseLogin(QString err, QString data)
{
QString sErr = "";
if (err.isEmpty()) {
cJSON* jsData = cJSON_Parse(data.toStdString().c_str());
if (jsData) {
cJSON* pCode = cJSON_GetObjectItem(jsData, "code");
cJSON* pData = cJSON_GetObjectItem(jsData, "data");
if (pCode->valueint == 200)
{
m_sToken = cJSON_GetObjectItem(pData, "token")->valuestring;
}
else {
cJSON* pError = cJSON_GetObjectItem(jsData, "error");
sErr = pError->valuestring;
}
}
cJSON_Delete(jsData);
}
else {
sErr = err;
}
emit sglLoginResult(sErr.isEmpty() , sErr);
if (sErr.isEmpty())
{
QTimer::singleShot(3000, this, SLOT(sltLoopTimeout())); //这是一次性定时器到了定时间隔之后只发送一次信号槽函数只处理一次。初始化时不用等1分钟更新,3秒后就更新数据,不过值调用一次
m_pLoopTimer->start(1000 * 60 * 1); //1分钟更新
//m_pLoopTimer->start(1000 * 10); //10秒更新
}
}
QT http请求数据
标签:value sock include config 文件 none errors verify add
原文地址:https://www.cnblogs.com/tingtaishou/p/11993214.html
评论