Sujet : [Tutoriel] Appeler WebService REST

Bonjour à tous,
alors je tiens à préciser tout de suite, le petit tuto qui suit est d'un niveau nettement plus élevé que les précédents (même si c'est pas super compliqué non plus tongue).

On va voir comment appeler un WebService et récupérer la réponse de celui-ci.

Pour information un WS sans Https peut se faire directement dans les .qml, mais les webservice en http sans token sont de tout même très rare et dans ce cas impossible de faire ça dans les fichier .qml.

Dans l'exemple si dessous je pars du principe que le webService nous renvoi un JSON (pour un XML les différences sont minimes).

Voyons donc ensemble COMENT KON FAIT ? smile

Première chose à faire créer une nouvelle classe, on va l'appeler myWebservice.
On doit donc avoir maintenant deux fichiers, myWebservice.ccp et myWebservice.hpp.

Dans le fichier .hpp on va déclarer no fonctions dont on va avoir besoin :

class myWebservice:public QObject
{
    Q_OBJECT

public:
    myWebservice();
    virtual ~myWebservice();
//     virtual ~myWebservice();
     /*!
      * Resets the value to its default value.
      */
//     Q_INVOKABLE void reset();
    Q_INVOKABLE void getInformations(QString,QString);
    private Q_SLOTS:

    void getWsInformations(QNetworkReply*);
    void finished(QNetworkReply*);
};


#endif /* MYWEBSERVICE_HPP_ */

Vous pouvez bien sûr changer les noms de tout ça, ce n'est qu'un exemple
.
Maintenant passons à la partie intéressant le cpp.

Premiére chose à faire on doit faire l'include du QtNetwork (#include <QtNetwork>). Sans ça on pourra rien faire.

On laisse le constructeur de la classe vide.

On passe ensuite à la première fonction qui va juste faire l'appelle à notre webservice.
On va générer une requête (depuis une URL), on va faire le call, et enfin lui dire ou aller quand il aura récupérer les informations :

void myWebservice::getInformations(QString url,QString call)
{
    QNetworkRequest request = QNetworkRequest();
    request.setUrl(QUrl(url));
    QNetworkAccessManager* networkAccessManager = new QNetworkAccessManager(this);
    MyCall = call;
    qDebug() << MyCall;
        connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(getWsInformations(QNetworkReply*)));
        networkAccessManager->get(request);
}

Dans le connect vous pouvez voir qu'on utilise la fonction getWsInformations, on va donc faire cette fonction ensemble.
On va donc récupérer notre objet QNetworkReply et le "lire" comme un fichier JSON.

void myWebservice::getWsInformations(QNetworkReply* reply){
qDebug() << "getWsInformations ! ";
    if (reply->error() == QNetworkReply::NoError)
      {
        QString mJsonData = reply->readAll();
        JsonDataAccess jda;
        qDebug() << mJsonData;
        QVariant mainList = jda.loadFromBuffer(mJsonData);
      }
      reply->deleteLater();
    }

Et voilà vous avez récupérer le retour du webService dans votre variable mainList !

A partir de là, il est très facile de mettre cette variable dans une ListView (elle sera votre dataSource) ou de continuer à parser comme si c'était un fichier JSON pour afficher les informations qui vous intéresse !

On pense juste à mettre sa fonction finished :

void myWebservice::finished(QNetworkReply* reply)
{
    reply->deleteLater();
}

Et voici un exemple d'appel d'un webService depuis l'applicationui.cpp

    myWebservice *appl = new myWebservice();
    appl->getInformations("https://lewebservice.com","champions");

Voilà on est tout bon, si jamais ça vous semble nécessaire j'ai un exemple complet que je peux mettre sur mon GitHub.
Celui si utilise 5 WS différents, stock les résultats dans un fichier SQL et utilise une partie dans l'interface.

http://www.blackberry-10.fr/forum/img/reglettes/z10.png
►   P'9982STK100-1 / 10.2.1.3442