Qt笔记-获取HTTP的POST请求提交的数据时需要注意的地方(2024-09-02)
此篇发布到互联网上的时间为:2024-11-25
这里总结下来还是编码的问题。
如下代码:
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"));
}
其中总是会卡住,原因是:
tcpSocket->waitForReadyRead();
照成wait的原因的是:
body.size() != contentLength
这里就是编码有问题,http中body的数据长度和http头的Content-Length不一样。特别是前端提交的数据带中文时。在大多数情况下,前端提交的数据都是utf8编码,而Qt的编码规则默认情况下操作系或登陆的用户有关。所以在Qt5下需要特别的指定(Qt4也需要,只是比Qt5麻烦下,多几行代码)。
修改成如下即可:
body.toUtf8().size() != contentLength
完整修改如下:
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"));
}