You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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();
});

修改说明

  1. 数值转字符串:使用QString::number()将数值类型转为保留三位小数的字符串,确保输出格式和服务器预期的"0.000"一致。
  2. 请求头设置:添加Content-Type: application/json头,告知服务器请求体是JSON格式,避免解析失败。

修改后生成的JSON会变成:

{
    "d": {
        "Duration": "8.000",
        "Id": "123456780XYZ",
        "LoadCumulLimit": "25.000",
        "Notes": "send from IGEL"
    }
}

完全符合服务器要求的格式,即可解决Forbidden错误。

内容的提问来源于stack exchange,提问作者Gia Huy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:45:27