Qt阻塞式发送post请求

525 阅读2分钟

直接贴出代码

  • http_post_c.h
    #pragma once
    #include <QCoreApplication>
    #include <QObject>
    #include <QEventLoop>
    #include <QObject>
    #include <QTimer>
    #include <QJsonObject>
    #include <QJsonDocument>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    #include <QNetworkRequest>
    #include <memory>
    #include <iostream>
    #include <QHttpMultiPart>
    
    
    class HttpPostC : public QObject
    {
            Q_OBJECT
    public:		
            // post file
            bool queryFile(const std::string& url, uint32_t timeout, QHttpMultiPart *multiPart)
            {
                    QByteArray queryErrorResult; queryErrorResult.clear();
                    //设置超时处理定时器
                    QTimer timer;
                    timer.setInterval(timeout);  // 设置超时时间 10 秒
                    timer.setSingleShot(true);  // 单次触发									
    
                    QUrl qUrl(url.c_str());
                    // qUrl.setUrl(url.c_str());
                    // 设置发送
                    QNetworkAccessManager* manager = new QNetworkAccessManager();
                    QNetworkRequest request;
                    // request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
                    request.setUrl(qUrl);
    
                    QNetworkReply* reply = manager->post(request, multiPart);
                    QEventLoop eventLoop;
                    connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
                    connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
                    timer.start();//启动定时器
                    eventLoop.exec();//启动事件循环
    
                    if (timer.isActive()) {//处理响应,定时器激活状态
                            timer.stop();//停止定时器
                            if (reply->error() != QNetworkReply::NoError) {//http请求出错,进行错误处理
                                    qDebug() << "http request error : " << reply->errorString();
                                    // 担心把multipart 销毁掉
                                    reply->deleteLater();
    
                                    // return queryErrorResult;
                                    return false;
                            }
                            else {
                                    // http - 响应状态码
                                    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
                                    qDebug() << "server ret Code : " << statusCode;
                                    if (statusCode == 200) {//http请求响应正常
                                            QByteArray replyContent = reply->readAll();
                                            std::string content = replyContent.toStdString();
                                            if (content.find("finish") != std::string::npos)
                                            {
                                                    qDebug() << "--------------------------------------------------recv finish----------------";
                                                    return true;
                                            }
                                            else
                                            {
                                                    qDebug() << "!!! recv not have finish";
                                                    return false;
                                                    // return replyContent;
                                            }										
                                    }
                                    else {
                                            // 担心把multipart 销毁掉
                                            reply->deleteLater();
                                            // return queryErrorResult;
                                            return false;
                                    }
                            }
                    }
                    else {//超时处理
                            disconnect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
                            reply->abort();
                            qDebug() << "http timeout ";
                            // return queryErrorResult;
                            return false;
                    }
                    reply->deleteLater();
                    // return queryErrorResult;
            }	  
    
            // post json
            bool queryJson(const std::string& url, uint32_t timeout, QJsonObject& jsonContent)
            {
                    QByteArray queryErrorResult; queryErrorResult.clear();
                    //设置超时处理定时器
                    QTimer timer;
                    timer.setInterval(timeout);  // 设置超时时间 10 秒
                    timer.setSingleShot(true);  // 单次触发
                                                                            // 合成URL,getIpAdressFromLocal获取IP地址
    
                    QUrl qUrl(url.c_str());
                    QByteArray postData;///>上传的json内容
                    postData.append(QJsonDocument(jsonContent).toJson());
    
                    // 设置发送
                    QNetworkAccessManager* manager = new QNetworkAccessManager();
                    QNetworkRequest request;
                    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
                    request.setUrl(qUrl);
    
                    // 开启一个局部的事件循环,等待响应结束,退出
                    qDebug() << "Send: " << jsonContent;
                    QNetworkReply* reply = manager->post(request, postData);
    
                    QEventLoop eventLoop;
                    connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
                    connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
    
                    timer.start();//启动定时器
                    eventLoop.exec();//启动事件循环
                    if (timer.isActive()) {//处理响应,定时器激活状态
                            timer.stop();//停止定时器
                            if (reply->error() != QNetworkReply::NoError) {//http请求出错,进行错误处理
                                    qDebug() << "http request error : " << reply->errorString();
                                    // 担心把multipart 销毁掉
                                    reply->deleteLater();
    
                                    // return queryErrorResult;
                                    return false;
                            }
                            else {
                                    // http - 响应状态码
                                    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
                                    qDebug() << "server ret Code : " << statusCode;
                                    if (statusCode == 200) {//http请求响应正常
                                            QByteArray replyContent = reply->readAll();
                                            std::string content = replyContent.toStdString();
                                            qDebug() << "content: " << content.c_str();
                                            if (content.find("finish") != std::string::npos)
                                            {
                                                    qDebug() << "recv finish";
                                                    return true;
                                            }
                                            else
                                            {
                                                    qDebug() << "!!! recv not have finish";
                                                    return false;
                                                    // return replyContent;
                                            }
                                    }
                                    else {
                                            // 担心把multipart 销毁掉
                                            reply->deleteLater();
                                            // return queryErrorResult;
                                            return false;
                                    }
                            }
                    }
                    else {//超时处理
                            disconnect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
                            reply->abort();
                            qDebug() << "http timeout ";
                            // return queryErrorResult;
                            return false;
                    }
                    reply->deleteLater();
                    // return queryErrorResult;
            }
    
    };
    
  • 使用
    QJsonObject qjson_obj;
    frmJsonDoc(vec_pre_cam_online, qjson_obj);
    HttpPostC post_obj;
    post_obj.queryJson(http_server_url, 200000, qjson_obj);  
    
  • 使用
    while (cnt-- > 0)
    {
            // 组帧, 组一个 QHttpMultiPart 出来
            std::shared_ptr<QHttpMultiPart> sp_qhttp_part = std::make_shared<QHttpMultiPart>(QHttpMultiPart::FormDataType);
            std::shared_ptr<QFile*> sp_pp_file = std::make_shared<QFile*>();
            getMultiPart(sp_qhttp_part.get(), sp_pp_file.get(), file_name_in, vec_param.at(0), vec_param.at(1), vec_param.at(2), vec_param.at(3));
    
            // 阻塞式发送 http post 请求  
            // HttpPostC post_obj;
            // ++ 写个工具函数,获取 url, 120 秒的等待时间, 文件太大了 	
            // 原计划用全局变量, 算了就用上层的,把他弄成 public static 注意,初始化这个全局变量不成功,后面就不要走下去了
            std::string http_server_url;
            getHttpServerUrl(http_server_url, VideoCapPusherManager::param.ip_dst, HTTP_SERVER_SUFIXX_AddAlarmInfo);
            HttpPostC post_obj;
            if (post_obj.queryFile(http_server_url, 1200000, sp_qhttp_part.get()))
            {
                    // 关闭文件  
                    (*sp_pp_file)->close();
    
                    // 删除文件  				
                    std::string file_name{ "./" };
                    file_name.append(file_name_in);
    
                    QFile file(file_name_in.c_str());
                    if (file.exists())
                    {				
                            if (file.remove())
                            {
                                    qDebug() << "--------------------------try del alarm pic,  success";
                            }
                            else
                            {
                                    qDebug() << "--------------------------try del alarm pic,  but failed";
                            }				
                    }
                    else
                    {
                            qDebug() << "--------------------------try del alarm pic,  but it not exist";
                    }
                    qDebug() << "--------------------------just return";
                    return;
            }
            // 关闭文件  
            (*sp_pp_file)->close();
            qDebug() << "try send img file once";
    }