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
相关产品推荐
相关产品推荐

