萌晓许
楼主
发布于 2023-4-19 13:54:26
阅读 1128
查看全部
目录
1、利用Qt提供的类实现向效劳器发送post和get恳求2、实现文件上传
1、利用Qt提供的类实现向效劳器发送post和get恳求
- #include <QCoreApplication>
- #include <QNetworkAccessManager>
- #include <QNetworkRequest>
- #include <QNetworkReply>
- #include <QJsonArray>
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QJsonParseError>
- #include <QJsonValue>
- #include <QString>
- #include <QDebug>
- #include <QFile>
- #include <QDateTime>
- #include <QDir>
- #include <QThread>
- #pragma execution_character_set("utf-8")
- void sendPostRequest()
- {
- QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
- //设置url
- QString url = "http://localhost:80/post";
- //设置头信息
- QNetworkRequest requestInfo;
- requestInfo.setUrl(QUrl(url));
- requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
- //requestInfo.setRawHeader("Content-Type","application/json");//效劳器要求的数据头部
- //requestInfo.setRawHeader("Accept","text/json,*/*;q=0.5");//效劳器要求的数据头部
- //发送数据
- QJsonObject regionObject;
- regionObject.insert("name","333");
- regionObject.insert("height", "2");
- regionObject.insert("dir", "0");
- QJsonArray pointAry;
- pointAry.append(0.8);
- pointAry.append(1.0);
- pointAry.append(0.0);
- pointAry.append(1.8);
- pointAry.append(2.0);
- pointAry.append(0.0);
- regionObject.insert("points", QJsonValue(pointAry));
- QJsonObject jsonObject;
- jsonObject.insert("Code", "asss");
- jsonObject.insert("parentId", 0);
- jsonObject.insert("depot", "past");
- jsonObject.insert("region", QJsonValue(regionObject));
- QJsonDocument jsonDoc;
- jsonDoc.setObject(jsonObject);
- QByteArray qByteHttpData = jsonDoc.toJson();
- QNetworkReply *reply = m_pHttpMgr->post(requestInfo, qByteHttpData);
- //添加事件循环机制,返回后再运行后面的
- QEventLoop eventLoop;
- QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
- eventLoop.exec(); //block until finish
- //错误处置
- if (reply->error() != QNetworkReply::NoError)
- {
- qDebug()<<"request protobufHttp handle errors here";
- QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- //statusCodeV是HTTP效劳器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
- qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
- qDebug(qPrintable(reply->errorString()));
- }
- //恳求收到的结果
- QByteArray responseByte = reply->readAll();
- QString strRes = responseByte;
- qDebug() << "Post:" << strRes;
- }
- void sendGetRequest()
- {
- QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
- //设置url
- QString url = "http://localhost:80/Get;
- QNetworkRequest requestInfo;
- requestInfo.setUrl(QUrl(url));
- //添加事件循环机制,返回后再运行后面的
- QEventLoop eventLoop;
- QNetworkReply *reply = m_pHttpMgr->get(requestInfo);
- QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
- eventLoop.exec(); //block until finish
- //错误处置
- if (reply->error() != QNetworkReply::NoError)
- {
- qDebug()<<"request protobufHttp handle errors here";
- QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- //statusCodeV是HTTP效劳器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
- qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
- qDebug(qPrintable(reply->errorString()));
- }
- //恳求返回的结果
- QByteArray responseByte = reply->readAll();
- QString strRes = responseByte;
- qDebug() << "Get:" << strRes;
- QFile file(QDir::currentPath() + "/myResponde.json");
- if(!file.open(QIODevice::ReadWrite))
- {
- qDebug() << "File open error";
- }
- file.write(responseByte);
- file.close();
- }
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- sendPostRequest();
- //sendGetRequest();
- return a.exec();
- }
复制代码 2、实现文件上传
- QT += core gui
- QT += network
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- CONFIG += c++11
复制代码 Qnetworkutils.h 头文件- #ifndef QNETWORKUTILS_H
- #define QNETWORKUTILS_H
- #include <iostream>
- #include <QString>
- #include <QNetworkRequest>
- using namespace std;
- namespace QNetWorkUtils
- {
- // http恳求数据
- struct HttpRequestData
- {
- HttpRequestData()
- {
- strServer = "127.0.0.1";
- nPort = 8082;
- strUrl = "";
- }
- // 重置数据
- void Reset()
- {
- strServer = "127.0.0.1";
- nPort = 8082;
- strUrl = "";
- bytePostData.clear();
- mapHeaders.clear();
- }
- QString strServer;
- int nPort;
- QString strUrl;
- QByteArray bytePostData;
- std::map<QNetworkRequest::KnownHeaders, QVariant> mapHeaders;
- };
- class CMultiPartItem
- {
- public:
- CMultiPartItem();
- // 该part为一个字符串,可以指定ContentType和ExContentDisposition
- CMultiPartItem(const QString& strName, const QString& strValue,
- const QString& strContentType = "",
- const QString& strExContentDisposition = "");
- // 该part为一个二进制块,可以指定ContentType(如“image/png”,可省略)和ExContentDisposition(如“filename="123.png"”,必需)
- CMultiPartItem(const QString& strName, void* pData, int nLen,
- const QString& strContentType = "",
- const QString& strExContentDisposition = "");
- QString m_sName;
- QString m_sValue;
- void* m_pData;
- int m_nDataLen;
- QString m_sContentType;
- QString m_sExContentDisposition;
- };
- typedef std::vector<CMultiPartItem> CMultiPartDatas;
- //************************************
- // 方法: 发送Get恳求
- // 返回值: bool
- // 参数: const HttpRequestData & data 恳求数据
- // 参数: QByteArray & respData 返回响应数据
- // 参数: int nTimeoutmsec 恳求超时毫秒
- //************************************
- bool HttpGet(
- const HttpRequestData& data,
- QByteArray& respData,
- int nTimeoutmsec = 30000,
- QString errMsg = QString(),
- int* pStatuCode = nullptr);
- //************************************
- // 方法: 发送Post恳求
- // 返回值: bool
- // 参数: const HttpRequestData & data 恳求数据
- // 参数: QByteArray & respData 返回响应数据
- // 参数: int nTimeoutmsec 恳求超时毫秒
- //************************************
- bool HttpPost(const HttpRequestData& data,
- QByteArray& respData,
- QString& errMsg,
- int nTimeoutmsec = 30000);
- //************************************
- // 方法: Multipart 数据post上传
- // 返回值: bool
- // 参数: const QString& strURL 恳求URL
- // 参数: const CMultiPartDatas& multiPartDatas 多部数据集合
- // 参数: QByteArray & respData 返回响应数据
- // 参数: int nTimeoutmsec
- bool UploadMultipartData(
- const QString& strURL,
- const CMultiPartDatas& multiPartDatas,
- QByteArray& respData,
- QString& errMsg,
- int nTimeoutmsec = 30000);
- bool UploadMultipartData(
- const HttpRequestData& data,
- const CMultiPartDatas& multiPartDatas,
- QByteArray& respData,
- QString& errMsg,
- int nTimeoutmsec = 30000);
- }
- #endif // QNETWORKUTILS_H
复制代码 Qnetworkutils.cpp 源文件 - #include "networkutils.h"
- #include <QNetworkRequest>
- #include <QNetworkAccessManager>
- #include <QNetworkReply>
- #include <QHttpMultiPart>
- #include <QEventLoop>
- #include <QTimer>
- namespace QNetWorkUtils
- {
- CMultiPartItem::CMultiPartItem() :
- m_pData(nullptr),
- m_nDataLen(0)
- {
- }
- CMultiPartItem::CMultiPartItem(const QString& strName, const QString& strValue,
- const QString& strContentType /*= ""*/, const QString& strExContentDisposition /*= ""*/)
- {
- m_pData = nullptr;
- m_nDataLen = 0;
- m_sName = strName;
- m_sValue = strValue;
- m_sContentType = strContentType;
- m_sExContentDisposition = strExContentDisposition;
- }
- CMultiPartItem::CMultiPartItem(const QString& strName, void* pData, int nLen,
- const QString& strContentType /*= ""*/, const QString& strExContentDisposition /*= ""*/)
- {
- m_pData = pData;
- m_nDataLen = nLen;
- m_sName = strName;
- m_sContentType = strContentType;
- m_sExContentDisposition = strExContentDisposition;
- }
- //
- bool HttpGet(
- const HttpRequestData& data,
- QByteArray& respData,
- int nTimeoutmsec /*= 30000*/,
- QString& errMsg,
- int* pStatuCode /*= nullptr*/)
- {
- // Assemble Url
- QString strUrl = data.strUrl;
- if (!data.strServer.isEmpty())
- strUrl = data.strServer + ":" + QString::number(data.nPort) + "/" + data.strUrl;
- const QUrl url = QUrl::fromUserInput(strUrl);
- // Send Get Requeset
- QNetworkRequest request(url);
- for (auto iter = data.mapHeaders.begin(); iter != data.mapHeaders.end(); iter++)
- {
- request.setHeader(iter->first, iter->second);
- }
- QNetworkAccessManager qNetAccessManager;
- QNetworkReply* reply = qNetAccessManager.get(request);
- if (reply == nullptr)
- return false;
- // Set time out
- QTimer timer;
- timer.setInterval(nTimeoutmsec); // 设置超时时间 30 秒
- timer.setSingleShot(true); // 单次触发
- // Set Loop Event
- QEventLoop eventLoop;
- QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
- QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- timer.start();
- int eRes = eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
- bool bResult = false;
- if (timer.isActive())
- {
- timer.stop();
- QNetworkReply::NetworkError replyError = reply->error();
- QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- int nStatusCode = variant.toInt();
- if (nullptr != pStatuCode)
- {
- *pStatuCode = nStatusCode;
- }
- if (replyError != QNetworkReply::NoError)
- {
- errMsg = reply->errorString();
- qDebug() << "Error String : " << errMsg << "\n";
- }
- else
- {
- if (nStatusCode == 200)
- {
- // Accept Response
- respData = reply->readAll();
- bResult = true;
- }
- else
- {
- bResult = false;
- }
- }
- }
- else
- {
- QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- reply->abort();
- qDebug() << strUrl << ":Timeout\n";
- }
- reply->deleteLater();
- reply = nullptr;
- return bResult;
- }
- bool HttpPost(const HttpRequestData &data, QByteArray &respData, QString &errMsg, int nTimeoutmsec)
- {
- // Assemble Url
- QString strUrl = data.strUrl;
- if (!data.strServer.isEmpty())
- strUrl = data.strServer + ":" + QString::number(data.nPort) + "/" + data.strUrl;
- const QUrl url = QUrl::fromUserInput(strUrl);
- // Send Post Requeset
- QNetworkRequest request(url);
- for (auto iter = data.mapHeaders.begin(); iter != data.mapHeaders.end(); iter++)
- {
- request.setHeader(iter->first, iter->second);
- }
- QNetworkAccessManager qNetAccessManager;
- QNetworkReply* reply = qNetAccessManager.post(request, data.bytePostData);
- if (reply == nullptr)
- return false;
- // Set time out
- QTimer timer;
- timer.setInterval(nTimeoutmsec); // 设置超时时间 30 秒
- timer.setSingleShot(true); // 单次触发
- // Set Loop Event
- QEventLoop eventLoop;
- QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
- QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- timer.start();
- eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
- bool bResult = false;
- if (timer.isActive())
- {
- timer.stop();
- QNetworkReply::NetworkError replyError = reply->error();
- if (replyError != QNetworkReply::NoError)
- {
- errMsg = reply->errorString();
- qDebug() << "Error String : " << reply->errorString() << "\n";
- }
- else
- {
- QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- int nStatusCode = variant.toInt();
- if (nStatusCode == 200)
- {
- // Accept Response
- respData = reply->readAll();
- bResult = true;
- }
- }
- }
- else
- {
- QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- reply->abort();
- errMsg = (strUrl + ":Timeout\n");
- qDebug() << strUrl << ":Timeout\n";
- }
- reply->deleteLater();
- reply = nullptr;
- return bResult;
- }
- bool UploadMultipartData(const HttpRequestData &data, const CMultiPartDatas &multiPartDatas, QByteArray &respData, QString &errMsg, int nTimeoutmsec)
- {
- QString strUrl = data.strUrl;
- if (!data.strServer.isEmpty())
- strUrl = data.strServer + ":" + QString::number(data.nPort) + "/" + data.strUrl;
- const QUrl url = QUrl::fromUserInput(strUrl);
- // 创建网络恳求
- QNetworkRequest request;
- request.setUrl(url);
- QHttpMultiPart httpMultiPart(QHttpMultiPart::FormDataType);
- // 处置Qt自动解析MultiPart得到boundary=带双引号问题
- for (auto iter = data.mapHeaders.begin(); iter != data.mapHeaders.end(); iter++)
- {
- request.setHeader(iter->first, iter->second);
- }
- request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data;boundary=" + httpMultiPart.boundary());
- FOR_EACH(itemPart, multiPartDatas)
- {
- QHttpPart httpPart;
- {
- QString strContentDisposition = QString("form-data; name="%1"%2").arg(itemPart.m_sName)
- .arg(itemPart.m_sExContentDisposition.isEmpty() ? "" : "; " + itemPart.m_sExContentDisposition);
- httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, strContentDisposition.toUtf8());
- if (itemPart.m_sContentType.isEmpty() == false)
- {
- httpPart.setHeader(QNetworkRequest::ContentTypeHeader, itemPart.m_sContentType.toUtf8());
- }
- if (itemPart.m_pData)
- {
- httpPart.setBody(QByteArray((const char*)itemPart.m_pData, itemPart.m_nDataLen));
- }
- else
- {
- httpPart.setBody(itemPart.m_sValue.toUtf8());
- }
- }
- httpMultiPart.append(httpPart);
- }
- QNetworkAccessManager qNetAccessManager;
- QNetworkReply* reply = qNetAccessManager.post(request, &httpMultiPart);
- if (reply == nullptr)
- {
- errMsg = QObject::tr("发送失败");
- return false;
- }
- QList<QByteArray> headers = reply->rawHeaderList();
- // Set time out
- QTimer timer;
- timer.setInterval(nTimeoutmsec); // 设置超时时间 30 秒
- timer.setSingleShot(true); // 单次触发
- // Set Loop Event
- QEventLoop eventLoop;
- QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
- QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- timer.start();
- eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
- bool bResult = false;
- if (timer.isActive())
- {
- timer.stop();
- QNetworkReply::NetworkError replyError = reply->error();
- if (replyError != QNetworkReply::NoError)
- {
- errMsg = reply->errorString();
- qDebug() << "Error String : " << reply->errorString() << "\n";
- }
- else
- {
- QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- int nStatusCode = variant.toInt();
- if (nStatusCode == 200)
- {
- // Accept Response
- respData = reply->readAll();
- bResult = true;
- }
- }
- }
- else
- {
- QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- reply->abort();
- qDebug() << data.strUrl << ":Timeout\n";
- }
- reply->deleteLater();
- reply = nullptr;
- return bResult;
- }
- bool UploadMultipartData(const QString &strURL, const CMultiPartDatas &multiPartDatas, QByteArray &respData, QString &errMsg, int nTimeoutmsec)
- {
- // 创建网络恳求
- QNetworkRequest request;
- request.setUrl(QUrl::fromUserInput(strURL));
- QHttpMultiPart httpMultiPart(QHttpMultiPart::FormDataType);
- // 处置Qt自动解析MultiPart得到boundary=带双引号问题
- request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data;boundary=" + httpMultiPart.boundary());
- foreach (itemPart, multiPartDatas)
- {
- QHttpPart httpPart;
- {
- QString strContentDisposition = QString("form-data; name="%1"%2").arg(itemPart.m_sName)
- .arg(itemPart.m_sExContentDisposition.isEmpty() ? "" : "; " + itemPart.m_sExContentDisposition);
- httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, strContentDisposition.toUtf8());
- if (itemPart.m_sContentType.isEmpty() == false)
- {
- httpPart.setHeader(QNetworkRequest::ContentTypeHeader, itemPart.m_sContentType.toUtf8());
- }
- if (itemPart.m_pData)
- {
- httpPart.setBody(QByteArray((const char*)itemPart.m_pData, itemPart.m_nDataLen));
- }
- else
- {
- httpPart.setBody(itemPart.m_sValue.toUtf8());
- }
- }
- httpMultiPart.append(httpPart);
- }
- QNetworkAccessManager qNetAccessManager;
- QNetworkReply* reply = qNetAccessManager.post(request, &httpMultiPart);
- if (reply == nullptr)
- {
- errMsg = QObject::tr("发送失败");
- return false;
- }
- QList<QByteArray> headers = reply->rawHeaderList();
- // Set time out
- QTimer timer;
- timer.setInterval(nTimeoutmsec); // 设置超时时间 30 秒
- timer.setSingleShot(true); // 单次触发
- // Set Loop Event
- QEventLoop eventLoop;
- QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
- QObject::connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- timer.start();
- eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
- bool bResult = false;
- if (timer.isActive())
- {
- timer.stop();
- QNetworkReply::NetworkError replyError = reply->error();
- if (replyError != QNetworkReply::NoError)
- {
- errMsg = reply->errorString();
- qDebug() << "Error String : " << reply->errorString() << "\n";
- }
- else
- {
- QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
- int nStatusCode = variant.toInt();
- if (nStatusCode == 200)
- {
- // Accept Response
- respData = reply->readAll();
- bResult = true;
- }
- }
- }
- else
- {
- QObject::disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
- reply->abort();
- qDebug() << strURL << ":Timeout\n";
- }
- reply->deleteLater();
- reply = nullptr;
- return bResult;
- }
- }
复制代码 到此这篇关于Qt利用QNetwork实现上传数据的示例代码的文章就介绍到这了,更多相关Qt QNetwork上传数据内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站! |
|