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"));
}
相关推荐
Nuanyt34 分钟前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
asaotomo37 分钟前
截图识题、AI 讲解、笔记沉淀:Chrome 扩展体验
前端·chrome·笔记
熊猫钓鱼>_>1 小时前
鸿蒙PC高分屏与键鼠交互适配:DPI缩放、右键菜单一次讲清
开发语言·笔记·华为·ai编程·harmonyos·鸿蒙·鸿蒙心迹
H_BB1 小时前
面试笔记:数据加密和心跳机制
笔记·面试·职场和发展
海绵宝宝转agent1 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
2601_961146202 小时前
实验室等离子表面处理设备安全整改记录:通风、UV、接地三项
笔记·安全·uv
ShineWinsu2 小时前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
飞浪纪元[FWC–FE]2 小时前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
ACP广源盛139246256732 小时前
高速 USB 切换方案选型笔记:10Gbps 全通道同步开关 LH6828@ACP 评估
笔记·硬件架构·国产芯片
Lhan.zzZ2 小时前
用 Qt 构建线程安全的通讯静态库:从线程亲和性到完整工程
c++·vscode·qt·tcp/ip·udp