5

Access a JSON webservice with Qt C++

 3 years ago
source link: https://blog.mathieu-leplatre.info/access-a-json-webservice-with-qt-c.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Access a JSON webservice with Qt C++

Access a JSON webservice with Qt C++

Fri 16 December 2011

Original post at Makina Corpus

Webservices are everywhere ! There are relevant in many situations, and accessing them from your Qt C++ application is not an heresy.

I will present here a very simple way to retrieve a JSON from a GET request.

HTTP Requests

Using QNetworkAccessManager is a piece of cake :

QNetworkAccessManager networkManager;

QUrl url("http://gdata.youtube.com/feeds/api/standardfeeds/most_popular?v=2&alt=json");
QNetworkRequest request;
request.setUrl(url);

QNetworkReply* currentReply = networkManager.get(request);  // GET

But, note that a slightly more generic approach would be to build the QUrl from a parameters list :

QUrl url("http://gdata.youtube.com/feeds/api/standardfeeds/");
QString method = "most_popular";
url.setPath(QString("%1%2").arg(url.path()).arg(method));

QMap<QString, QVariant> params;
params["alt"] = "json";
params["v"] = "2";

foreach(QString param, params.keys()) {
    url.addQueryItem(param, params[param].toString());
}

Parsing JSON

Get yourself a slot to parse the QNetworkReply :

connect(&networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onResult(QNetworkReply*)));
void YourClass::onResult(QNetworkReply* reply)
{
    if (m_currentReply->error() != QNetworkReply::NoError)
        return;  // ...only in a blog post

    QString data = (QString) reply->readAll();

    QScriptEngine engine;
    QScriptValue result = engine.evaluate(data);

    /*
      Google YouTube JSON looks like this :

      {
        "version": "1.0",
        "encoding": "UTF-8",
        "feed": {
          ..
          ..
          "entry": [{
            "title": {
                "$t": "Nickelback- When We Stand Together"
            },
            "content": {
                "type": "application/x-shockwave-flash",
                "src": "http://www.youtube.com/v/76vdvdll0Y?version=3&f=standard&app=youtube_gdata"
            },
            "yt$statistics": {
                "favoriteCount": "29182",
                "viewCount": "41513706"
            },
            ...
            ...
          },
          ...
          ...
          ]
        }
      }
    */

    // Now parse this JSON according to your needs !
    QScriptValue entries = result.property("feed").property("entry");
    QScriptValueIterator it(entries);
    while (it.hasNext()) {
        it.next();
        QScriptValue entry = it.value();

        QString link = entry.property("content").property("src").toString();
        int viewCount = entry.property("yt$statistics").property("viewCount").toInteger();

        // Do something with those...
    }
}

That's it :)

If you want more complexity, and don't mind adding extra-dependencies, check out Tomasz Siekierda's QtWebService !

#c++, #qt, #json - Posted in the Dev category


© Copyright 2020 by Mathieu Leplatre. mnmlist Theme

Content licensed under the Creative Commons attribution-noncommercial-sharealike License.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK