Send POST request with QT and read Json Response

Viewed 5198

I'm new in a QT development. I'm trying to do a simple Post Request to a rest service in order to read a Json Data.

Currently I've wrote:

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);
}

After that I don't know how procede. I've made a empty method

void LoginWindow::serviceRequestFinished(QNetworkReply* reply){ }

but I dont know how do inside of them.

The Post request should return me:

{
    "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"
        }
    ]

]
}

I've read that exist a library QJson but I think the official doc is a little bit confused and I can not figure out how to proceed.

2 Answers

So far seems to be OK, next you should add some code to your 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;

Let me know if it works

Your handler could look like this:

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();
    }
}

This example includes error handling for both - networking and JSON parsing. It is taken from https://github.com/Martchus/syncthingtray/blob/master/connector/syncthingconnection.cpp#L907.

There is actually good documentation about parsing JSON with Qt: http://doc.qt.io/qt-5/json.html

Also have a look at the new syntax to connect Signals & Slots.

Related