我是QT开发的新手。我正在尝试对休息服务执行简单的Post请求以读取Json数据。
目前我写道:
void LoginWindow::on_pushButton_clicked(){
// Setup the webservice url
QUrl serviceUrl = QUrl("http://urlrestservice.com");
QByteArray postData;
postData.append("request=userdata&");
postData.append("user=myusername&");
postData.append("password=mypasswod");
// Call the webservice
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
//QNetworkRequest::setHeader();
QNetworkRequest request(serviceUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(
QString("text/xml")));
connect(manager, SIGNAL(finished(QNetworkReply*)), this,
SLOT(serviceRequestFinished(QNetworkReply*)));
manager->post(request, postData);
}
之后我不知道怎么回事。我做了一个空方法
void LoginWindow::serviceRequestFinished(QNetworkReply* reply){ }
但我不知道他们内心是怎么做的。
Post请求应该返回我:
{
"response": {
"status": "200",
"message": "Correct request"
},
"data": [
[
{
"href": "link",
"text": "string matr"
},
{
"href": "link",
"text": "string type"
},
{
"href": "link",
"text": "string name"
},
{
"href": "link",
"text": "string state"
}
]
]
}
我读过有一个库QJson,但我认为官方文档有点混乱,我无法弄清楚如何继续。
答案 0 :(得分:3)
到目前为止似乎没问题,接下来你应该在serviceReqiestFinished中添加一些代码。
#include <QNetworkReply>
#include <QJsonValue>
#include <QJsonValueRef>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
void LoginWindow::serviceRequestFinished(QNetworkReply* reply){
QByteArray buffer = reply->readAll();
qDebug() << buffer;
QJsonDocument jsonDoc(QJsonDocument::fromJson(buffer));
QJsonObject jsonReply = jsonDoc.object();
QJsonObject response = jsonReply["response"].toObject();
QJsonArray data = jsonReply["data"].toArray();
qDebug() << data;
让我知道它是否有效
答案 1 :(得分:0)
您的处理程序可能如下所示:
void SyncthingConnection::readConfig()
{
auto *const reply = static_cast<QNetworkReply *>(sender());
reply->deleteLater();
switch (reply->error()) {
case QNetworkReply::NoError: {
const QByteArray response(reply->readAll());
QJsonParseError jsonError;
const QJsonDocument replyDoc = QJsonDocument::fromJson(response, &jsonError);
if (jsonError.error != QJsonParseError::NoError) {
emitError(tr("Unable to parse Syncthing config: "), jsonError, reply, response);
handleFatalConnectionError();
return;
}
m_rawConfig = replyDoc.object();
emit newConfig(m_rawConfig);
m_hasConfig = true;
concludeReadingConfigAndStatus();
break;
}
case QNetworkReply::OperationCanceledError:
return; // intended, not an error
default:
emitError(tr("Unable to request Syncthing config: "), SyncthingErrorCategory::OverallConnection, reply);
handleFatalConnectionError();
}
}
此示例包括网络和JSON解析的错误处理。它取自https://github.com/Martchus/syncthingtray/blob/master/connector/syncthingconnection.cpp#L907。
实际上有关于使用Qt解析JSON的良好文档:http://doc.qt.io/qt-5/json.html
另请参阅连接信号和放大器的新语法。槽。