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

Qt向PHP脚本发送JSON并接收返回值问题:返回内容为空

解决Qt与PHP许可证验证通信返回空的问题

我来帮你搞定这个问题!你现在遇到的返回内容为空的情况,核心有两个原因:

  • 请求Content-Type未正确设置:你发送的是纯JSON数据,但没有告诉服务器这个类型,PHP的$_POST只会解析application/x-www-form-urlencoded或multipart/form-data格式的请求体,所以拿不到JSON内容。
  • 异步请求被同步读取:QNetworkAccessManager的post是异步操作,你直接调用reply->readAll()时,请求还没完成,自然读不到任何数据。

下面是具体的修改方案:

一、Qt代码修改

主要做两处调整:设置正确的Content-Type,改用信号槽处理异步回复:

// 建议把QNetworkAccessManager作为类成员变量,避免请求过程中被销毁
QNetworkAccessManager *am = new QNetworkAccessManager(this);

QNetworkRequest request(QUrl("http://localhost/ives/webserver/serverrequest.php"));
request.setHeader(QNetworkRequest::UserAgentHeader, "IVarejo");
// 关键:告诉服务器我们发送的是JSON格式数据
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

QJsonObject root;
root.insert("tipoRequest", "validacao"); // 直接传入字符串即可,无需fromVariant
QJsonDocument sendDoc(root);
QString json = sendDoc.toJson(QJsonDocument::Compact);
qDebug() << "JSON: " << json;

QNetworkReply *reply = am->post(request, json.toUtf8());
// 用信号槽监听请求完成事件
connect(reply, &QNetworkReply::finished, this, [=](){
    if(reply->error() == QNetworkReply::NoError){
        QByteArray responseData = reply->readAll();
        qDebug() << "Resultado: " << responseData;
        
        // 可选:解析返回的JSON许可证信息
        QJsonDocument respDoc = QJsonDocument::fromJson(responseData);
        if(respDoc.isObject()){
            QJsonObject respObj = respDoc.object();
            int restanteDias = respObj.value("licenca_restante_dias").toInt();
            bool pago = respObj.value("pago").toBool();
            // 这里添加你的业务逻辑处理
        }
    } else {
        qDebug() << "请求错误:" << reply->errorString();
    }
    reply->deleteLater(); // 记得释放回复对象资源
});

二、PHP脚本修改

因为请求体是JSON格式,我们需要读取原始请求数据并解码:

// 读取原始JSON请求体
$rawRequest = file_get_contents('php://input');
// 解码为关联数组
$requestData = json_decode($rawRequest, true);

// 验证请求类型
if($requestData && isset($requestData['tipoRequest']) && $requestData['tipoRequest'] === 'validacao'){
    // 这里替换为你的实际业务逻辑:查询数据库获取许可证状态
    $licencaInfo = [
        'licenca_restante_dias' => 60, // 示例剩余天数
        'pago' => true, // 是否已付费
        'status' => 'ativo' // 许可证状态
    ];
    echo json_encode($licencaInfo);
} else {
    // 返回错误信息
    echo json_encode(['erro' => '请求无效或参数缺失']);
}

这样修改后,Qt就能正确发送JSON请求,PHP也能解析并返回你需要的许可证信息了。

内容的提问来源于stack exchange,提问作者Samuel Ives

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:27:13