苏不同 2024-05-13 12:04 采纳率: 0%
浏览 24

QT 调用HTTP的POST上传时耗时久咋解决

QT 调用HTTP post命令上传时耗时相比poatman,apifox等软件较久
并且上传数据较小时,速度反而慢,当上传速度大于一定数值时速度就变快了200多ms
不开加速器时速度也慢,开了加速器也变块了,请问大家是啥原因咋解决呀

/*
    功能说明:post请求
    参数说明:key - 加密的密钥
             data - 加密的参数
    返   回:无
*/
void GaodePost::PostRequest(QString key,QString data)
{
    QJsonObject dataobj;            //构建json对象dataobj
 
    dataobj.insert("key",key);
    dataobj.insert("data",data);
 
    QJsonDocument document;
    document.setObject(dataobj);
    QByteArray byte_array = document.toJson(QJsonDocument::Compact);    //类型转换
 
    //http请求
    QNetworkRequest request1;
    QNetworkAccessManager nam;
    connect(&nam, &QNetworkAccessManager::finished, this, &GaodePost::receiveGaodePostReply);
 
    request1.setUrl(QUrl("http://123.12.365.152/接口名"));    //要请求的网址
    
    //请求头token设置
request1.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
    QString token = "xxxxxxxxxxxxxxxxxxxxxxxx";
    QString token_headerData = token;
    request1.setRawHeader("token",token_headerData.toLocal8Bit());
 
    QNetworkReply* reply = nam.post(request1, byte_array);        //post请求头+传输的数据
 
    //开启事件循环,直到请求完成
    QEventLoop loop;
    connect(reply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
    loop.exec();
 
}
 
//接收请求返回的数据
QString GaodePost::receiveGaodePostReply(QNetworkReply *reply)
{
    QString res = reply->readAll();
    return res;
}

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-13 12:04
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是想要解决在使用Qt进行HTTP POST请求上传数据时,相比其他工具(如Postman、Apifox等)耗时较长的问题。您希望找出导致上传速度慢的原因,并寻求解决方案以提高上传效率。

    【问题出现原因】:根据您提供的信息,可能的原因包括:

    1. 网络环境:网络连接的质量可能影响上传速度,即使在开启加速器的情况下。
    2. 服务器响应:目标服务器可能对小数据量的请求响应较慢,或者存在某种流量整形策略。
    3. Qt的HTTP实现:Qt的网络库可能在处理HTTP请求时存在性能瓶颈,尤其是在处理较小数据包时。
    4. 事件循环:在PostRequest函数中使用QEventLoop可能不是性能最优的方式,因为它会阻塞当前线程,直到网络请求完成。

    【问题解决方案】:以下是一些可能的解决方案:

    1. 优化网络连接:检查和优化您的网络环境,确保网络连接是稳定和高速的。
    2. 服务器端优化:如果可能,检查服务器端的配置和响应时间,看是否有优化空间。
    3. 使用异步请求:修改您的代码,使用Qt的异步网络请求功能,避免阻塞事件循环。
    4. 调整Qt网络库设置:检查Qt网络库的设置,看是否有优化参数可以调整。

    【提供代码】:以下是使用Qt异步网络请求的示例代码:

    void GaodePost::PostRequestAsync(QString key, QString data)
    {
        QJsonObject dataobj;
        dataobj.insert("key", key);
        dataobj.insert("data", data);
    
        QJsonDocument document;
        document.setObject(dataobj);
        QByteArray byte_array = document.toJson(QJsonDocument::Compact);
    
        QNetworkRequest request;
        request.setUrl(QUrl("http://123.12.365.152/接口名"));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json;charset=utf-8");
        QString token = "xxxxxxxxxxxxxxxxxxxxxxxx";
        request.setRawHeader("token", token.toLocal8Bit());
    
        QNetworkAccessManager *nam = new QNetworkAccessManager(this);
        connect(nam, &QNetworkAccessManager::finished, this, [this, nam](QNetworkReply *reply) {
            QString res = reply->readAll();
            // 处理响应结果 res
            nam->deleteLater(); // 清理网络管理器
        });
    
        QNetworkReply *reply = nam->post(request, byte_array);
        // 无需等待回复,异步执行
    }
    
    // 接收请求返回的数据的处理可以放在槽函数中
    

    【代码运行方式】:您需要在Qt开发环境中运行此代码,确保您已经设置了正确的Qt开发环境和网络连接。

    【代码预期运行结果】:异步请求不会阻塞事件循环,因此理论上应该可以提高上传数据的效率。您应该能够看到更快的响应时间和提高的上传速度。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月13日

悬赏问题

  • ¥15 vxworks交叉编译gcc报错error: missing binary operator before token "("
  • ¥15 JSzip压缩文件时如何设置解压缩密码
  • ¥66 nuxtjs3 ,老是报错,内容:我有代码仓库,如何解决?
  • ¥30 WPF如何实现动态Y轴
  • ¥15 读取parquet文件某一列的数据但是输出是整个列名和格式
  • ¥15 机动目标 制导律建模问题
  • ¥100 求Java socks 转发实现Demo
  • ¥20 随身WiFi移动网络访问不了
  • ¥50 RAD_XE11.3获取android11手机的IMEI码
  • ¥15 linux的gcc命令报错