Qt笔记-获取HTTP的POST请求提交的数据时需要注意的地方(2024-09-02)

此篇发布到互联网上的时间为:2024-11-25

这里总结下来还是编码的问题。

如下代码:

cpp 复制代码
else if(method == "POST"){

    int contentLength = DataAnaylsisTool::getHttpHeaderValue(msg.toLower(), "content-length").toInt();
    QString body = DataAnaylsisTool::getHttpBody(msg);

    while(body.size() != contentLength){

        tcpSocket->waitForReadyRead();
        qint64 available = tcpSocket->bytesAvailable();
        QString bodyMsg = tcpSocket->read(available);
        body += bodyMsg;
    }

    json = interface->postResponse(body);
    json->insertValue("code", 20000);
    json->insertValue("time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
}

其中总是会卡住,原因是:

bash 复制代码
tcpSocket->waitForReadyRead();

照成wait的原因的是:

cpp 复制代码
body.size() != contentLength

这里就是编码有问题,http中body的数据长度和http头的Content-Length不一样。特别是前端提交的数据带中文时。在大多数情况下,前端提交的数据都是utf8编码,而Qt的编码规则默认情况下操作系或登陆的用户有关。所以在Qt5下需要特别的指定(Qt4也需要,只是比Qt5麻烦下,多几行代码)。

修改成如下即可:

cpp 复制代码
body.toUtf8().size() != contentLength

完整修改如下:

cpp 复制代码
else if(method == "POST"){

    int contentLength = DataAnaylsisTool::getHttpHeaderValue(msg.toLower(), "content-length").toInt();
    QString body = DataAnaylsisTool::getHttpBody(msg);

    while(body.toUtf8().size() != contentLength){

        tcpSocket->waitForReadyRead();
        qint64 available = tcpSocket->bytesAvailable();
        QString bodyMsg = tcpSocket->read(available);
        body += bodyMsg;
    }

    json = interface->postResponse(body);
    json->insertValue("code", 20000);
    json->insertValue("time", QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
}
相关推荐
feiyangqingyun34 分钟前
纯Qt结合ffmpeg实现本地摄像头采集/桌面采集/应用程序窗口采集/指定采集帧率和分辨率等
qt·ffmpeg·qt桌面采集·qt摄像头采集·qt程序窗口采集
Mr Sorry3 小时前
Non-stationary Diffusion For Probabilistic Time Series Forecasting论文阅读笔记
论文阅读·笔记
南猿北者3 小时前
Cmake学习笔记
笔记·学习·策略模式
码小文4 小时前
Altium Designer 22使用笔记(8)---PCB电气约束设置
笔记·嵌入式硬件·硬件工程·ad22
王廷胡_白嫖帝6 小时前
Qt个人通讯录项目开发教程 - 从零开始构建联系人管理系统
开发语言·qt
戏言zare6 小时前
Qt设置软件使用期限【新版防修改系统时间】
qt
UserNamezhangxi7 小时前
kotlin 协程笔记
java·笔记·kotlin·协程
大橘7 小时前
【qml-5】qml与c++交互(类型单例)
qt·qml
猿究院--冯磊8 小时前
计算机网络--HTTP协议
网络协议·计算机网络·http
让代码飞~9 小时前
idea进阶技能掌握, 使用自带HTTP测试工具,完全可替代PostMan
java·http·intellij-idea·postman