使用QNetworkAccessManager发送PUT JSON请求遇403禁止错误
解决QNetworkAccessManager PUT请求JSON数值字段格式问题
服务器返回Forbidden错误的核心原因是:你生成的JSON中Duration和LoadCumulLimit是数字类型(如8、25),但服务器要求这两个字段必须是带三位小数的字符串类型(如"8.000"、"25.000")。
解决方案
将数值类型的字段格式化为指定格式的字符串后再存入QJsonObject,同时确保请求头正确设置Content-Type为application/json(服务器可能依赖这个头解析请求体)。
修改后的代码
// 构建JSON对象时,将数值转为三位小数的字符串 QJsonObject data; // 把duration数值格式化为保留三位小数的字符串 data["Duration"] = QString::number(workplace->data["duration"].toDouble(), 'f', 3); data["Id"] = id; // 把load_cumul_limit数值格式化为保留三位小数的字符串 data["LoadCumulLimit"] = QString::number(workplace->data["load_cumul_limit"].toDouble(), 'f', 3); data["Notes"] = workplace->dataText["Notes"]; QJsonObject newData; newData["d"] = data; QJsonDocument doc(newData); QByteArray finalData = doc.toJson(); // 关键:添加Content-Type请求头 request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); reply = manager->put(request, finalData); connect(reply, &QNetworkReply::finished, [=](){ if(reply->error() == QNetworkReply::NoError){ QString contents = QString::fromUtf8(reply->readAll()); qDebug() << contents; } else{ QString err = reply->errorString(); qDebug() << err; } reply->deleteLater(); });
修改说明
- 数值转字符串:使用
QString::number()将数值类型转为保留三位小数的字符串,确保输出格式和服务器预期的"0.000"一致。 - 请求头设置:添加
Content-Type: application/json头,告知服务器请求体是JSON格式,避免解析失败。
修改后生成的JSON会变成:
{ "d": { "Duration": "8.000", "Id": "123456780XYZ", "LoadCumulLimit": "25.000", "Notes": "send from IGEL" } }
完全符合服务器要求的格式,即可解决Forbidden错误。
内容的提问来源于stack exchange,提问作者Gia Huy
相关产品推荐
相关产品推荐

