使用QNetworkRequest,实现网络连接

首先要在头文件中包含以下文件

#include<QNetworkRequest>
#include<QNetworkReply>
#include<QNetworkAccessManager>

post请求的写法

/**
    * @brief Postt请求
    * @param (不可为空)strUrl 输入参数,请求的Url地址,如:http://192.168.0.255/login  根据需要在后面拼接相应的内容,传递变量
    * @param (可为空)strFiles json 格式字符串,用于上传文件,表单数据,json格式的表单值,
    *       {
            "file1":                        注意表示路径要用 '/',key中应含有"file",单个文件或多个文件都用数组格式
                [
                "C:/user/project/test1.txt", 
                "C:/user/project/test2.txt"
                ]              
            "form1":"f1",
            "user":{
                    "id":1,
                    "loginName":"loginName1",
                    "userName","userName1"
                    }
            } !记得转成QString类型传入
    * @param (可为空)strPost 登陆时,用于传json格式body,"{\"loginName\":\"zhangsan\",\"password\":\"123456\",\"machineCode\":\"machineCodeX64\"}"
    *                传值时,用于传json格式header,"{\"header1\":\"h1\",\"header2\":\"h2\"}"
    * @param  (建议传空变量)strResponse 输出参数,返回的内容
    * @return 返回是否Post成功
    */
    CHTTPCLIENT_EXPORT int doPost(QString& strUrl, const QString& strFiles, const QString& strPost, QString& strResponse);
int CHttpClient::doPost(QString& strUrl, const QString& strfiles, const QString& strPost, QString& strResponse)
{
    std::tuple<QString, QString> FUrl = ^^^^^^^^;//通过读取本地配置文件获得端口号和主机号
    QString Url = QString("http://%1:%2/%3").arg(std::get<0>(FUrl)).arg(std::get<1>(FUrl)).arg(strUrl);
    QTimer timer;										// 计时,一是不让程序在请求完成前就退出,另一方面是控制请求时间,判断超时就退出
    timer.setInterval(1500);                                // 设置超时时间 1.5 秒
    timer.setSingleShot(true);                              // 单次触发
    QNetworkAccessManager* g_manager = new QNetworkAccessManager();            // 初始化
    QNetworkRequest request;
    request.setUrl(QUrl(Url));							// 设置请求地址
    request.setRawHeader("Datagrid-Authorization:", Token.toUtf8());//token,是用户登陆时获得的,之后的请求都要先设置token
    QNetworkReply* reply = nullptr;						// 初始化请求的返回类
    if (strfiles.isEmpty()) {
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");//设置请求头
        QJsonDocument strPost_doc = QJsonDocument::fromJson(strPost.toUtf8());
        QByteArray dataArray = strPost_doc.toJson(QJsonDocument::Compact);
        reply = g_manager->post(request, dataArray);     // 发出post请求
    }
    else {
        QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
        QJsonParseError JSON_Error;
        QJsonDocument doc = QJsonDocument::fromJson(strfiles.toUtf8(), &JSON_Error);
        if (doc.isEmpty() || (JSON_Error.error != QJsonParseError::NoError)) {
            return 0;
        }
        //JSON对象
        QVariantMap jsonMap = doc.toVariant().toMap();	
        QMap<QString, QVariant> paths;					// 存上传文件的路径
        QMap<QString, QVariant> params{};				// 存其他要请求的数据
        for (auto it = jsonMap.constBegin(); it != jsonMap.constEnd(); ++it) {
            if (it.key().contains("file")) {
                paths.insert(it.key(), it.value());
            }
            else if (it.key().contains("form")) {
                params.insert(it.key(), it.value().toString().toUtf8());
            }
            else {
                auto _valuetype = it.value().type();
                if (!it.value().toJsonObject().isEmpty()) {
                    auto _value = it.value().toJsonObject();
                    QJsonDocument json_doc(_value);
                    params.insert(it.key(), QString(json_doc.toJson()).remove(QRegExp("\\s")).toUtf8());
                }
                else if (!it.value().toString().isEmpty()) {
                    auto _value = it.value().toString();
                    params.insert(it.key(), _value.toUtf8());
                }
                else if (it.value().toInt() != 0) {
                    auto _value = it.value().toInt();
                    params.insert(it.key(), QString(_value).toUtf8());
                }
                else if (!it.value().toStringList().isEmpty()) {
                    auto _value = it.value().toStringList().join(",").toUtf8();
                    params.insert(it.key(), _value);
                }
            }
        }
        QJsonDocument jsonDocument = QJsonDocument::fromJson(strPost.toUtf8().data());
        if (!jsonDocument.isNull()) {//判断是否为空
            QJsonObject* json_obj = new QJsonObject(jsonDocument.object());
            for (auto it = json_obj->begin(); it != json_obj->end(); ++it) {
                request.setRawHeader(it.key().toUtf8(), it.value().toString().toUtf8());
            }
        }

        for (auto it = params.cbegin(); it != params.cend(); ++it) {
            QString name = it.key();
            auto value = it.value().toByteArray();
            QHttpPart textPart;
            if (name.contains("form")) {
                textPart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
                textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"%1\"").arg(name));
            }
            else {
                textPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=utf-8"));
                textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"%1\"").arg(name));
            }
            textPart.setBody(value);
            multiPart->append(textPart);
        }
        if (paths.size() > 0) {
            for (auto it = paths.constBegin(); it != paths.constEnd(); ++it) {
                QString inputName = it.key();
                auto filelist = it.value().toList();
                for (int i = 0; i < filelist.size(); ++i)
                {
                    QString _file = filelist.at(i).toString();
                    QFile* file = new QFile(_file, multiPart);
                    QFileInfo file_info(_file);
                    if (!file->open(QIODevice::ReadOnly)) {
                        QString failMessage = QString("打开文件失败[%2]: %1").arg(_file).arg(file->errorString());
                        multiPart->deleteLater();
                        return 0;
                    }
                    auto x = file_info.fileName();
                    QString disposition = QString("form-data; name=\"%1\"; filename=\"%2\"").arg(inputName).arg(file_info.fileName());
                    QHttpPart filePart;
                    filePart.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
                    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(disposition));
                    filePart.setBodyDevice(file);
                    multiPart->append(filePart);
                }
            }
        }

        reply = g_manager->post(request, multiPart);
        multiPart->setParent(reply);
    }
    if (nullptr == reply)return 0;
    QEventLoop loop;                                                    // 开启循环等待
    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);        // 超时则退出循环
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); // 请求成功则退出循环
    timer.start();                                                      // 开始计时
    loop.exec();                                                        // 启动事件循环
    if (timer.isActive()) {                                             // 处理响应
        timer.stop();
        if (reply->error() != QNetworkReply::NoError) {                 // 错误处理
            qDebug() << "Error String : " << reply->errorString();
        }
        else {
            QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            int nStatusCode = variant.toInt();
            QByteArray bytes = reply->readAll();                        // 处理请求到的数据
            QJsonParseError jsonError;
            QJsonDocument jsDoc = QJsonDocument::fromJson(bytes, &jsonError);
            if (jsonError.error != QJsonParseError::NoError) {
                qDebug() << QStringLiteral("解析Json失败");
                return 0;
            }
            strResponse = QString(jsDoc.toJson(QJsonDocument::Indented));   // 把请求结果回传
        }
    }
    else {                                                              // 处理超时
        QObject::disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
        reply->abort();
        reply->deleteLater();
        qDebug() << "Timeout";
    }
    return 1;
}

get请求示例

 /**
   * @brief Get请求
   * @param (不可为空)strUrl 输入参数,请求的Url地址,如:http://192.168.0.3/security/manager/user/test/get/simplest
   * @param (不下载文件时可以传空值)strSavePath 下载文件的保存地址,如:下载图片格式文件strSavePath = "C:/Users/Administrator/Pictures/pic.png",请求文件类型要和提供的保存格式一致,否则会导致乱码
   * @param (建议传空变量)strResponse 输出参数,返回的内容
   * @return 返回是否Get成功
   */
    CHTTPCLIENT_EXPORT int doGet(QString& strUrl, const QString& strSavePath, QString& strResponse);
int CHttpClient::doGet(QString& strUrl, const QString& strSavePath, QString& strResponse)
{
    std::tuple<QString, QString> FUrl = ^^^^^^^^;//获得端口号和主机号
    QString Url = QString("http://%1:%2/%3").arg(std::get<0>(FUrl)).arg(std::get<1>(FUrl)).arg(strUrl);
    qDebug() << Url;
    QTimer timer;
    timer.setInterval(15000);                                // 设置超时时间 1.5 秒
    timer.setSingleShot(true);                              // 单次触发
    QNetworkRequest request;
    QNetworkReply* reply = nullptr;
    request.setUrl(QUrl(Url));
    request.setRawHeader("Datagrid-Authorization:", g_Token.toUtf8());
    QNetworkAccessManager* g_manager = new QNetworkAccessManager();
    if (strSavePath.isEmpty()) {
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    }
    reply = g_manager->get(request);
    QEventLoop loop;                                                    // 开启循环等待
    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);        // 超时则退出循环
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); // 请求成功则退出循环
    timer.start();                                                      // 开始计时
    loop.exec();                                                        // 启动事件循环
    if (timer.isActive()) {                                             // 处理响应
        timer.stop();
        if (reply->error() != QNetworkReply::NoError) {                 // 错误处理
            qDebug() << "Error String : " << reply->errorString();
        }
        else {
            QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            int nStatusCode = variant.toInt();
            QByteArray bytes = reply->readAll();                        // 处理请求到的数据
            QJsonParseError jsonError;
            QJsonDocument jsDoc = QJsonDocument::fromJson(bytes, &jsonError);
            if (jsonError.error != QJsonParseError::NoError) {
                qDebug() << QStringLiteral("解析Json失败");
                if (!strSavePath.isEmpty()) {
                    QFile* file = new QFile(strSavePath);
                    // [1] 打开下载文件,如果打开文件出错,不进行下载
                    if (!file->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
                        file->close();
                        file->deleteLater();
                        qDebug().noquote() << QString("[错误] 打开文件出错: %1").arg(strSavePath);
                        return 0;
                    }
                    file->write(bytes);
                    file->flush();          //不关闭文件,文件内容将为空
                    file->close();
                    file->deleteLater();
                }
            }
            else {
                strResponse = QString(jsDoc.toJson(QJsonDocument::Indented));   // 把请求结果回传
            }
        }
    }
    else {                                                              // 处理超时
        QObject::disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
        reply->abort();
        reply->deleteLater();
        qDebug() << "getTimeout";
    }
    return 1;
}

使用get下载文件

bool doDownLoad(const QString& strUrl, const QString& strSavePath)
{
    bool isSuccess = true;
    QFile* tempFile;
    QTimer timer;
    QNetworkRequest request;
    QNetworkReply* reply = nullptr;
    request.setUrl(QUrl(strUrl));
    request.setRawHeader("Datagrid-Authorization", g_Token.toUtf8());
    QNetworkAccessManager* g_manager = new QNetworkAccessManager();
    reply = g_manager->get(request);

    QEventLoop loop;                                                                // 开启循环等待
    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);           // 超时则退出循环
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);    // 请求成功则退出循环
    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        if (reply->error() != QNetworkReply::NoError) {                             // 错误处理
            qDebug() << "Error String : " << reply->errorString() << strUrl ;
            emit errorBox("资源下载错误:"+ reply->errorString());
            isSuccess = false;
        }
        });
    QObject::connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(slotDownLoadSpeed(qint64, qint64))); // 请求成功则退出循环
    QObject::connect(reply, &QNetworkReply::readyRead, [&]() {
        QByteArray bytes = reply->readAll();
        tempFile->write(bytes);
        tempFile->flush();
        });
    if (!strSavePath.isEmpty()) {
        tempFile = new QFile(strSavePath);
        // [1] 打开下载文件,如果打开文件出错,不进行下载
        if (!tempFile->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
            tempFile->close();
            tempFile->deleteLater();
            qDebug().noquote() << QString("[错误] 打开文件出错: %1").arg(strSavePath);
            emit errorBox("资源下载路径错误:"+ strSavePath);
            isSuccess = false;
        }
    }
    loop.exec();                                                                    // 启动事件循环
    tempFile->close();
    tempFile->deleteLater();
    return isSuccess;
}

剩余的put,和delete请求,套用上面两个请求即可

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值