FAQ Qt
FAQ QtConsultez toutes les FAQ
Nombre d'auteurs : 26, nombre de questions : 298, dernière mise à jour : 15 juin 2021
- Comment télécharger une page Web avec QHttp ?
- Comment exécuter une requête simple sur un serveur avec la méthode GET ?
- Comment exécuter une requête avec envoi d'information sur un serveur avec la méthode GET ?
- Comment exécuter une requête avec envoi d'informations sur un serveur avec la méthode POST ?
- Comment récupérer un cookie avec QHttp ?
Qt a encapsulé le protocole HTTP au sein de la classe QHttp. Celle-ci possède notamment les méthodes suivantes :
- int post ( const QString & path, QIODevice * data, QIODevice * to = 0) : permet l'envoi de données ;
- int get ( const QString & path, QIODevice * to = 0) : permet la réception des données ;
- int close () : ferme la connexion.
Remarque 1 : cette classe possède de nombreux signaux qui permettent de suivre l'état de la connexion avec le serveur. Référez-vous à la doc pour plus d'information.
Remarque 2: depuis Qt 4.4, QHttp est déprécié au profit des classes QNetworkAccessManager et QNetworkReply, qui offrent plus de souplesse que QHttp.
Pour exécuter une requête, nous avons besoin de deux choses : QHttp et QUrl.
QHttp permet de faire la requête proprement dite, alors que QUrl simplifie l'interaction avec les données pour se connecter au serveur (son adresse, son port ainsi que la sécurisation (HTTPS) ou non de la connexion).
Il faut aussi connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle-ci contiendra une fonction connexion afin d'effectuer la requête.
#include
<QHttp>
#include
<QUrl>
class
Client : public
QHttp
{
Q_OBJECT
private
:
QUrl
url;
int
idRequete;
public
slots
:
void
recuperationResultat(int
id, bool
error)
{
if
( error )
// Il y a eu une erreur pendant la requête
return
;
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requêtes sont en cours)
if
( id ==
idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans un QByteArray
this
->
readAll();
}
public
:
Client(const
QString
&
urlSite)
{
url =
QUrl
(urlSite); // On enregistre l'URL du site
idRequete =
0
;
// Connexion du signal de fin de requête avec notre analyseur de résultat
connect
(this
, SIGNAL
(requestFinished(int
, bool
)), this
, SLOT
(recuperationResultat(int
, bool
)));
}
void
connexion(void
)
{
this
->
setHost ( url.host(),
// on détermine si c'est une connexion sécurisée
( url.scheme().toLower() ==
"https"
) ? QHttp
::
ConnectionModeHttps : QHttp
::
ConnectionModeHttp,
url.port() ==
-
1
? 0
: url.port() // On détermine le port
);
idRequete =
this
->
get(url.path(),0
); // La requête est lancée
}
}
;
Pour exécuter une requête plus évoluée, nous avons besoin de trois choses : QHttp, QUrl et QHttpRequestHeader
QHttp exécute la requête proprement dite, alors que QUrl simplifie l'interaction avec les données de connexion au serveur à contacter (son adresse, son port ainsi que la sécurisation (HTTPS) ou non de la connexion). QHttpRequestHeader ajoute des informations sur notre connexion. Grâce à cette classe, nous pouvons passer des cookies ou encore changer le user-agent (qui permet d'identifier le navigateur).
Il faut aussi connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle-ci contiendra une fonction connexion afin d'effectuer la requête.
#include
<QHttp>
#include
<QUrl>
class
Client : public
QHttp
{
Q_OBJECT
private
:
QUrl
url;
int
idRequete;
public
slots
:
void
recuperationResultat(int
id, bool
error)
{
if
( error )
// Il y a eu une erreur pendant la requête
return
;
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requêtes sont en cours)
if
( id ==
idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans un QByteArray
this
->
readAll();
}
public
:
Client(const
QString
&
urlSite)
{
url =
QUrl
(urlSite); // On enregistre l'URL du site
idRequete =
0
;
// Connexion du signal de fin de requête avec notre analyseur de résultat
connect
(this
, SIGNAL
(requestFinished(int
, bool
)), this
, SLOT
(recuperationResultat(int
, bool
)));
}
void
connexion(void
)
{
this
->
setHost ( url.host(),
// on détermine si c'est une connexion sécurisée
( url.scheme().toLower() ==
"https"
) ? QHttp
::
ConnectionModeHttps : QHttp
::
ConnectionModeHttp,
url.port() ==
-
1
? 0
: url.port() // On détermine le port
);
// Ici nous créons l'entête pour notre requête
QHttpRequestHeader
reqHeader("GET"
, "http://qt.nokia.com"
);
reqHeader.setValue("Host"
, "http://qt.nokia.com"
);
reqHeader.setValue("User-Agent"
, "Nom que vous voulez"
);
reqHeader.setValue("Cookie"
, "idducookie"
); // Permet de passer un cookie pour être reconnu par le serveur
idRequete =
this
->
request(reqHeader);
}
}
;
Si vous utilisez Firefox, et que vous ne savez pas quoi mettre dans l'en-tête, vous pouvez utiliser LiveHTTPHeaders qui affichera les informations des en-têtes envoyés et reçus par le navigateur.
Lien : LiveHttpHeaders
Une requête POST permet, par exemple, de se connecter à un Site Web en envoyant un identifiant et un mot de passe.
Pour exécuter une requête POST, nous avons besoin de trois choses : QHttp, QUrl et QHttpRequestHeader
QHttp exécute la requête proprement dite, alors que QUrl simplifie l'interaction avec les données de connexion au serveur à contacter (son adresse, son port ainsi que la sécurisation (HTTPS) ou non de la connexion). QHttpRequestHeader ajoute des informations sur notre connexion. Grâce à cette classe, nous pouvons passer des cookies ou encore changer le user-agent (qui permet d'identifier le navigateur).
Il faut aussi connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle-ci contiendra une fonction connexion afin d'effectuer la requête.
#include
<QHttp>
#include
<QUrl>
class
Client : public
QHttp
{
Q_OBJECT
private
:
QUrl
url;
int
idRequete;
public
slots
:
void
recuperationResultat(int
id, bool
error)
{
if
( error )
// Il y a eu une erreur pendant la requête
return
;
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requêtes sont en cours)
if
( id ==
idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans un QByteArray
this
->
readAll();
}
public
:
Client(const
QString
&
urlSite)
{
url =
QUrl
(urlSite); // On enregistre l'url du site
idRequete =
0
;
// Connexion du signal de fin de requête avec notre analyseur de résultat
connect
(this
, SIGNAL
(requestFinished(int
, bool
)), this
, SLOT
(recuperationResultat(int
, bool
)));
}
void
connexion(void
)
{
this
->
setHost ( url.host(),
// on détermine si c'est une connexion sécurisée
( url.scheme().toLower() ==
"https"
) ? QHttp
::
ConnectionModeHttps : QHttp
::
ConnectionModeHttp,
url.port() ==
-
1
? 0
: url.port() // On détermine le port
);
// Prépare une chaîne qui contiendra les éléments pour la connexion
QString
searchString =
QString
("username="
) +
QString
("toto"
) +
QString
("&password="
) +
QString
("tata"
);
// Ici nous créons l'en-tête pour notre requête
QHttpRequestHeader
postRequest("POST"
, "http://qt.nokia.com"
);
postRequest.setValue("Host"
, "http://qt.nokia.com"
);
postRequest.setValue("User-Agent"
, "Nom du navigateur"
);
// Requête avec le passage des identifiants
idRequete =
this
->
request(postRequest,searchString.toUtf8());
}
}
;
Si vous utilisez Firefox, et que vous ne savez pas quoi mettre dans l'en-tête, vous pouvez utiliser LiveHTTPHeaders qui affichera les informations des en-têtes envoyés et reçus par le navigateur.
Lien : LiveHttpHeaders
Pour récupérer un cookie, nous avons besoin de quatre choses : QHttp, QUrl, QHttpRequestHeader et QHttpResponseHeader.
QHttp exécute la requête proprement dite, alors que QUrl simplifie l'interaction avec les données de connexion au serveur à contacter (son adresse, son port ainsi que la sécurisation (HTTPS) ou non de la connexion). QHttpRequestHeader ajoute des informations sur notre connexion. Grâce à cette classe, nous pouvons passer des cookies ou encore changer le user-agent (qui permet d'identifier le navigateur). QHttpResponseHeader doit être analysé afin de récupérer le cookie.
Il faut connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur, et le slot responseHeaderReceived(const QHttpResponseHeader&) pour récupérer l'en-tête de réponse du serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle-ci contiendra une fonction connexion afin d'effectuer la requête.
#include
<QHttp>
#include
<QUrl>
class
Client : public
QHttp
{
Q_OBJECT
private
:
QUrl
url;
int
idRequete;
public
slots
:
void
recuperationResultat(int
id, bool
error)
{
if
( error )
// Il y a eu une erreur pendant la requête
return
;
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requêtes sont en cours)
if
( id ==
idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans un QByteArray
this
->
readAll();
}
void
Client ::
recuperationCookie(const
QHttpResponseHeader
&
header)
{
// Ce test est tiré de la norme RFC 1945
if
( header.reasonPhrase() ==
QString
("FOUND"
) &&
header.statusCode() >=
300
&&
header.statusCode() <=
399
)
{
// Récupération du cookie
cookie =
header.value("Set-Cookie"
);
}
else
{
// Il est possible que les identifiants ne soient pas bons...
}
}
public
:
Client(const
QString
&
urlSite)
{
url =
QUrl
(urlSite); // On enregistre l'url du site
idRequete =
0
;
// Connexion du signal de fin de requête avec notre analyseur de résultat
connect
(this
, SIGNAL
(requestFinished(int
, bool
)), this
, SLOT
(recuperationResultat(int
, bool
)));
// Connexion du signal de réponse du serveur avec notre analyseur de résultat
connect
( this
, SIGNAL
(responseHeaderReceived(const
QHttpResponseHeader
&
) ),
this
, SLOT
(recuperationCookie (const
QHttpResponseHeader
&
) ) );
}
void
connexion(void
)
{
this
->
setHost ( url.host(),
// on détermine si c'est une connexion sécurisée
( url.scheme().toLower() ==
"https"
) ? QHttp
::
ConnectionModeHttps : QHttp
::
ConnectionModeHttp,
url.port() ==
-
1
? 0
: url.port() // On détermine le port
);
// Prépare une chaîne qui contiendra les éléments pour la connexion
QString
searchString =
QString
("username="
) +
QString
("toto"
) +
QString
("&password="
) +
QString
("tata"
);
// Ici nous créons l'en-tête pour notre requête
QHttpRequestHeader
postRequest("POST"
, "http://qt.nokia.com"
);
postRequest.setValue("Host"
, "http://qt.nokia.com"
);
postRequest.setValue( "User-Agent"
, "Nom du navigateur"
);
// Requête avec le passage des identifiants
idRequete =
this
->
request(postRequest,searchString.toUtf8());
}
}
;
Si vous utilisez Firefox, et que vous ne savez pas quoi mettre dans l'en-tête, vous pouvez utiliser LiveHTTPHeaders qui affichera les informations des en-têtes envoyés et reçus par le navigateur.
Lien : LiveHttpHeaders