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"));
}
相关推荐
智者知已应修善业30 分钟前
【51单片机4位静态数码管显示1234】2023-11-14
c++·经验分享·笔记·算法·51单片机
郝学胜_神的一滴43 分钟前
Qt 高级开发 021:零基础吃透 QVBoxLayout 垂直布局
c++·qt
whyTeaFo1 小时前
MIT6.1810: xv6 book Chapter4: Traps and system calls 笔记
笔记
jimbo_lee1 小时前
yocto 用法(随手笔记,记录以备不时之需)
笔记·yocto
胡图图不糊涂^_^4 小时前
测试用例篇——设计测试用例的方法
笔记·学习·测试用例·判定表法·正交法生成用例测试·等价类·边界值
IT19954 小时前
Dify笔记-知识库创建后设置和召回测试
笔记·dify
飞翔中文网5 小时前
Java学习笔记之抽象类
java·笔记·学习
誰能久伴不乏5 小时前
libmodbus 在 Windows 环境下报 “Invalid argument“ 的排错记录
c++·qt·modbus
中屹指纹浏览器6 小时前
2026指纹浏览器行为指纹对抗技术详解:从算法识别到真人模拟全方案
经验分享·笔记
郑洁文6 小时前
基于Python的HTTP服务漏洞信息收集工具设计与实现
开发语言·python·http