使用QT发送POST请求并阅读Json Response

时间:2017-09-21 15:49:31

标签: c++ json qt

我是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,但我认为官方文档有点混乱,我无法弄清楚如何继续。

2 个答案:

答案 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

另请参阅连接信号和放大器的新语法。槽。