Client HTTP
Présente un client HTTP simple.
Cet exemple montre comment un client HTTP simple peut récupérer des fichiers à partir d'hôtes distants.

L'essentiel de cet exemple se déroule dans la classe HttpWindow. C'est donc sur celle-ci que nous allons nous concentrer.
QNetworkRequest networkRequest(url);
networkRequest.setTcpKeepAliveIdleTimeBeforeProbes(20s);
networkRequest.setTcpKeepAliveIntervalBetweenProbes(2s);
networkRequest.setTcpKeepAliveProbeCount(5);Depuis Qt 6.11, il est possible de spécifier explicitement les paramètres de keepalive TCP pour une instance de ` QNetworkRequest`. Dans l’extrait de code ci-dessus, nous remplaçons les valeurs par défaut utilisées par ` QNetworkAccessManager ` afin d’adopter une stratégie plus agressive. Cela peut s’avérer utile, par exemple, pour détecter rapidement les blocages réseau causés par des modifications du réseau sous Linux. Dans cet exemple précis, la connexion sera fermée après trente secondes d’inactivité.
reply.reset(qnam.get(networkRequest));À l’aide de ` QNetworkAccessManager`, nous lançons le téléchargement d’une ressource indiquée par ` url`. Si vous ne connaissez pas cette fonction ou la fonction utilisée, ` QNetworkAccessManager::get()`, ou si vous souhaitez simplement l’étudier plus en détail, consultez sa documentation ainsi que celles de ` QNetworkReply ` et ` QNetworkRequest`.
connect(reply.get(), &QNetworkReply::finished, this, &HttpWindow::httpFinished);
connect(reply.get(), &QIODevice::readyRead, this, &HttpWindow::httpReadyRead);
#if QT_CONFIG(ssl)
connect(reply.get(), &QNetworkReply::sslErrors, this, &HttpWindow::sslErrors);
#endifCi-dessus, nous connectons certains des signaux de la réponse à des slots de la classe. Ces slots se chargeront à la fois de traiter les données entrantes et de finaliser le téléchargement ou de gérer les erreurs.
connect(reply.get(), &QIODevice::readyRead, this, &HttpWindow::httpReadyRead);En ce qui concerne le traitement des données entrantes, comme nous ne connaissons pas la taille maximale de téléchargement d'une entrée potentielle et que nous ne voulons pas épuiser la mémoire d'un ordinateur susceptible d'exécuter le programme d'exemple, nous traitons les données entrantes dans ` QNetworkReply::readyRead()` plutôt que dans ` QNetworkReply::finished()`.
void HttpWindow::httpReadyRead()
{
// This slot gets called every time the QNetworkReply has new data.
// We read all of its new data and write it into the file.
// That way we use less RAM than when reading it at the finished()
// signal of the QNetworkReply
if (file)
file->write(reply->readAll());
}Nous écrivons ensuite les données dans un fichier au fur et à mesure de leur arrivée. C’est moins pratique, mais l’application consommera moins de mémoire à son pic d’activité !
connect(reply.get(), &QNetworkReply::sslErrors, this, &HttpWindow::sslErrors);Le signal ` QNetworkReply::sslErrors()` nous permet également de gérer les erreurs pouvant survenir lors de la négociation TLS lors de la connexion à des sites web sécurisés (c'est-à-dire HTTPS).
void HttpWindow::sslErrors(const QList<QSslError> &errors)
{
QString errorString;
for (const QSslError &error : errors) {
if (!errorString.isEmpty())
errorString += '\n';
errorString += error.errorString();
}
if (QMessageBox::warning(this, tr("TLS Errors"),
tr("One or more TLS errors has occurred:\n%1").arg(errorString),
QMessageBox::Ignore | QMessageBox::Abort)
== QMessageBox::Ignore) {
reply->ignoreSslErrors();
}
}Dans cet exemple, nous affichons une boîte de dialogue à l’utilisateur afin qu’il puisse choisir d’ignorer ou non les erreurs.
QNetworkReply::NetworkError error = reply->error();
const QString &errorString = reply->errorString();
if (error != QNetworkReply::NoError) {
QFile::remove(fi.absoluteFilePath());
// For "request aborted" we handle the label and button in cancelDownload()
if (!httpRequestAborted) {
statusLabel->setText(tr("Download failed:\n%1.").arg(errorString));
downloadButton->setEnabled(true);
}
return;
}Si une erreur se produit, ` QNetworkReply ` émettra le signal ` QNetworkReply::errorOccurred()`, suivi du signal ` QNetworkReply::finished()`. Dans cet exemple, nous ne nous intéressons qu’à ce dernier. Nous gérons toute erreur potentielle dans le slot correspondant en supprimant le fichier dans lequel nous étions en train d’écrire, puis nous affichons l’erreur à l’aide de notre étiquette d’état.
connect(&qnam, &QNetworkAccessManager::authenticationRequired,
this, &HttpWindow::slotAuthenticationRequired);Si vous vous connectez à un site web utilisant l’authentification HTTP, en supposant que vous n’ayez pas fourni au préalable les identifiants à utiliser, vous pouvez gérer l’absence d’identifiants lorsque le site web les demande. Avec ` QNetworkAccessManager`, nous effectuons cette gestion dans un slot connecté au signal ` QNetworkAccessManager::authenticationRequired()`. Nous établissons cette connexion une seule fois, dans le constructeur.
void HttpWindow::slotAuthenticationRequired(QNetworkReply *, QAuthenticator *authenticator)
{
QDialog authenticationDialog;
Ui::Dialog ui;
ui.setupUi(&authenticationDialog);
authenticationDialog.adjustSize();
ui.siteDescription->setText(tr("%1 at %2").arg(authenticator->realm(), url.host()));
// Did the URL have information? Fill the UI.
// This is only relevant if the URL-supplied credentials were wrong
ui.userEdit->setText(url.userName());
ui.passwordEdit->setText(url.password());
if (authenticationDialog.exec() == QDialog::Accepted) {
authenticator->setUser(ui.userEdit->text());
authenticator->setPassword(ui.passwordEdit->text());
}
}Dans cet exemple, nous affichons une boîte de dialogue dans laquelle l’utilisateur peut soit saisir un nom d’utilisateur et un mot de passe, soit annuler. L’annulation entraîne l’échec de la requête.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.