Utiliser un service Web simple avec Qt

| traducteur : Thibaut Cuvelier | Qt Quarterly |

Les classes de réseau de Qt permettent le développement d'applications réseau compliquées, mais certains Web Services sont toujours assez simples pour être utilisés avec un peu d'imagination et encore moins de code.

Cet article est une traduction autorisée de Using a Simple Web Service with Qt.

Commentez

- Titre : Utiliser un service Web simple avec Qt

- Auteurs : traducteur : Thibaut Cuvelier, Qt Quarterly

- Parution : 21 août 2009

- Mise à jour : 1 août 2011

- Licence : Copyright ® 2007 Nokia Corporation and/or its subsidiary(-ies). Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. L'article original

- II. Introduction

- III. Utiliser le service

- IV. Préparer ce qui doit l'être

- V. Envoyer et recevoir

- VI. Aller plus loin

- VII. Divers

I - L'article original

Qt Quarterly est une revue trimestrielle électronique proposée par Nokia à destination des développeurs et utilisateurs de Qt. Vous pouvez trouver les versions originales.

Nokia, Qt, Qt Quarterly et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.

Cet article est la traduction de l'article Using a Simple Web Service with Qt paru dans la Qt Quarterly Issue 23.

Cet article est une traduction d'un des tutoriels écrits par Nokia Corporation and/or its subsidiary(-ies) inclus dans la documentation de Qt, en anglais. Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia.

II - Introduction

Un tel service est fourni par MathTran Project. Ce projet open-source veut transformer le contenu mathématique dans des formats plus répandus sur le Web, comme des images PNG ou du balisage MathML. Le service fonctionne sur des serveurs de l'Open University, en Angleterre, grâce au financement du JISC (Joint Information Systems Committee). Actuellement, il permet de transformer des formules en images PNG.

Ici, nous allons montrer comment utiliser les classes de réseau de Qt d'une manière la plus simple possible dans des applications graphiques, en utilisant le service Web pour prévisualiser des formules entrées dans la zone réservée en tant qu'image. Dans le futur, le projet MathTran espère offrir un service équivalent pour transformer des formules en balisage MathML, qui pourrait être rendu grâce à la solution MML Widget, disponible parmi les autres Qt Solutions.

III - Utiliser le service

Au centre du système, un serveur Web. Les clients envoient leurs formules au serveur, en l'encodant en tant que partie de l'URI dans la requête HTTP, en employant la méthode GET. Le serveur décode l'entrée, la passe à un démon , convertit la sortie en image, et envoie la réponse appropriée.

Cette équation est écrite comme ceci :

\vec{\nabla}\cdot\vec{B} = 0

Ce texte est encodé et accolé en tant que demande au reste de l'URI de la requête.

http://mathtran.org/cgi-bin/mathtran?D=3;tex=%5Cvec%7B%5Cnabla%7D%5Ccdot%5Cvec%7BB%7D%20%3D%200

Tout ce que l'application doit faire pour obtenir une image est d'envoyer cette requête et d'attendre la réponse. Notre application utilisera QUrl et QHttp pour rendre l'opération aussi simple que possible.

IV - Préparer ce qui doit l'être

Dans le constructeur de notre classe, Window, nous construisons un objet QHttp pour communiquer avec le serveur en deux étapes.

1. Nous connectons le signal clicked() du bouton Update au slot fetchImage(), ce qui initialise la requête avec le serveur ;

2. Puisque nous voulons le résultat d'une requête HTTP de méthode GET, nous connectons le signal done() au slot updateForm.

En faisant abstraction des détails de l'interface graphique, le constructeur contient ce code pour établir les connexions.

Window::Window(QWidget *parent)
: QWidget(parent)
{
http = new QHttp(this);
connect(http, SIGNAL(done(bool)),
this, SLOT(updateForm(bool)));
...
connect(updateButton, SIGNAL(clicked()),
this, SLOT(fetchImage()));
...
}

V - Envoyer et recevoir

Puisque nous pouvons envoyer la requête et en recevoir la réponse avec le même objet, nous devons nous assurer que les deux étapes se sont déroulées correctement. Dans le slot fetchImage(), nous empêchons l'utilisateur d'envoyer une nouvelle requête tant que l'actuelle n'est pas achevée en désactivant le bouton.

void Window::fetchImage()
{
updateButton->setEnabled(false);

QUrl url;
url.setPath("/cgi-bin/mathtran");
url.setQueryDelimiters('=', ';');
url.addQueryItem("D", "3");
url.addQueryItem("tex", QUrl::toPercentEncoding(
equationEditor->toPlainText()));

http->setHost("mathtran.org");
http->get(url.toString());
}

Nous utilisons la flexibilité de la classe QUrl pour gérer la génération de l'URI. Puisque nous voulons laisser au buffer de QHttp les données obtenues du serveur, nous passons simplement la représentation de l'URI à la fonction get()

Quand ce slot retourne, la boucle événementielle de Qt continue son déroulement. L'objet QHttp va faire son travail de gestion des requêtes HTTP et de leurs réponses. Quand la réponse finale arrive, il émet le signal done(), et le slot updateForm() est appelé.

void Window::updateForm(bool error)
{
if (!error)
{
QImage image;
if (image.loadFromData(http->readAll()))
{
QPixmap pixmap = QPixmap::fromImage(image);
outputLabel->setPixmap(pixmap);
}
}
updateButton->setEnabled(true);
}

S'il n'y a pas eu d'erreur, nous pouvons convertir les données reçues en un QPixmap pour l'utiliser dans un QLabel. Peu importe si la requête a échoué ou pas, nous réactivons le bouton Update, pour que l'utilisateur puisse à nouveau essayer.

VI - Aller plus loin

Le service MathTran, bien que très simple, propose d'autres paramètres avec lesquels on peut jouer. La brique logicielle du serveur est disponible sur SourceForge, vous pouvez donc aussi lancer votre propre serveur. Allez voir les conditions d'utilisation pour plus d'informations sur l'utilisation du serveur public de MathTran.

Le code source de l'exemple de cet article est disponible

VII - Divers

J'adresse ici de chaleureux remerciements à Alp pour ses relecture et encouragement, et à koopajah pour sa relecture orthographique !

Au nom de toute l'équipe Qt, j'aimerais adresser le plus grand remerciement à Nokia pour nous avoir autorisé la traduction de cet article !