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"));
}
相关推荐
zhensherlock13 分钟前
Protocol Launcher 系列:1Writer iOS 上的 Markdown 文档管理
javascript·笔记·ios·typescript·node.js·iphone·ipad
森G16 分钟前
40、对话框---------事件系统
c++·qt
EmmaXLZHONG26 分钟前
Django By Example - 学习笔记
笔记·python·学习·django
prog_610341 分钟前
【笔记】用cursor手搓cursor(五)再见claude
人工智能·笔记·大语言模型·agent
扑火的小飞蛾1 小时前
OpenClaw Dashboard 部署与远程访问笔记
笔记
fLDiSQV1W1 小时前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
网络协议·http·okhttp
Frank_refuel1 小时前
QT->信号与槽详解下补充(概述、使用、自定义、连接方式、其他说明)
开发语言·qt
Engineer邓祥浩1 小时前
JVM学习笔记(5) 第二部分 自动内存管理 第4章 虚拟机性能监控、故障处理工具
jvm·笔记·学习
小灰灰搞电子2 小时前
Qt UI 线程详解-阻塞与解决方案
开发语言·qt·ui
森G2 小时前
41、数据库---------事件系统
c++·qt