直接贴出代码
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"; }