我正在尝试与外部服务器进行通信,以查看程序的用户是否已有许可证,因此我必须使用机器ID将JSON发送到我的服务器在帐户中,我应该返回JSON内容,例如许可证的天数等信息,如果已付款等。
。QNetworkAccessManager am;
QNetworkRequest request(QUrl("http://localhost/ives/webserver/serverrequest.php"));
request.setHeader(QNetworkRequest::UserAgentHeader, "IVarejo");
QJsonObject root;
root.insert("tipoRequest", QJsonValue::fromVariant("validacao"));
QJsonDocument sendDoc;
sendDoc.setObject(root);
QString json = sendDoc.toJson(QJsonDocument::Compact);
qDebug() << "JSON: " << json;
QNetworkReply *reply = am.post(request, json.toUtf8());
qDebug() << "Resultado: " << reply->readAll();
php脚本:
<?php
if(isset($_POST))
echo json_encode($_POST);
?>
但是我得到一个空的答案,与浏览器不同时,我通过表格发送任何数据
JSON: "{"tipoRequest":"validacao"}"
Resultado: ""
QNetworkReply *reply = am.post(request, json.toUtf8());
呼叫,您必须等待响应。
您可以通过两种方式进行操作:
waitforreadyread
reply->waitForReadyRead();
qDebug() << "Resultado: " << reply->readAll(); //now You can use readAll
或连接到ReadyRead信号 - QT 中的首选方式是,因为它不会阻止您的当前线程。
connect(reply, &QIODevice::readyRead, [reply](){
qDebug() << "Resultado: " << reply->readAll();
});
在这里使用lambdas非常方便,但这不是必需的。您也可以将其连接到一个插槽。
还记得:
注意:请求完成后,用户有责任在适当的时间删除qnetworkreply对象。请勿将其直接删除在已连接到完成((的插槽中。您可以使用DeleteLater((函数。