Client HTTP

Démonstration d'un client HTTP simple.

Cet exemple montre comment un simple client HTTP peut récupérer des fichiers sur des hôtes distants.

L'utilisateur saisit l'URL, le nom du fichier et l'emplacement du téléchargement dans la fenêtre principale. La classe QNetworkAccessManager utilise ces informations pour télécharger le fichier

Le travail principal de cet exemple est effectué dans la classe HttpWindow. Nous nous concentrerons donc sur cette classe.

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 TCP keepalive pour une QNetworkRequest. Dans l'extrait ci-dessus, nous remplaçons les paramètres par défaut utilisés par QNetworkAccessManager pour suivre une stratégie plus agressive. Cela peut s'avérer utile, par exemple, pour la détection précoce des blocages de réseau causés par des modifications du réseau sous Linux. Dans cet exemple particulier, la connexion sera fermée après trente secondes d'inactivité.

reply.reset(qnam.get(networkRequest));

En utilisant QNetworkAccessManager, nous commenç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);
#endif

Ci-dessus, nous connectons certains signaux de la réponse à des slots de la classe. Ces slots s'occuperont à la fois des données entrantes et de la finalisation du téléchargement/du traitement des erreurs.

connect(reply.get(), &QIODevice::readyRead, this, &HttpWindow::httpReadyRead);

En ce qui concerne le traitement des données entrantes, étant donné que nous ne connaissons pas la taille maximale de téléchargement de toute entrée potentielle et que nous ne voulons pas épuiser la mémoire de tout ordinateur susceptible d'exécuter le programme d'exemple, nous traitons les données entrantes dans QNetworkReply::readyRead() au lieu de 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 le fichier au fur et à mesure qu'elles arrivent. C'est moins pratique, mais l'application consommera moins de mémoire à son apogée !

connect(reply.get(), &QNetworkReply::sslErrors, this, &HttpWindow::sslErrors);

Avec le signal QNetworkReply::sslErrors(), nous pouvons également gérer les erreurs qui peuvent se produire pendant la poignée de main TLS lors de la connexion à des sites web sécurisés (c.-à-d. 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 montrons une boîte de dialogue à l'utilisateur pour 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 émet le signal QNetworkReply::errorOccurred(), suivi du signal QNetworkReply::finished(). Dans cet exemple, nous ne nous connectons qu'à ce dernier. Nous gérons toute erreur potentielle dans le slot correspondant en supprimant le fichier dans lequel nous écrivions, et nous affichons l'erreur avec notre étiquette d'état.

connect(&qnam, &QNetworkAccessManager::authenticationRequired,
        this, &HttpWindow::slotAuthenticationRequired);

Si vous vous connectez à un site web qui utilise l'authentification HTTP, en supposant que vous n'ayez pas fourni à l'avance les informations d'identification à utiliser, vous pouvez gérer les informations d'identification manquantes lorsque le site web les demande. Avec QNetworkAccessManager, nous le faisons 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 insérer un nom d'utilisateur et un mot de passe, soit annuler. L'annulation entraîne l'échec de la demande.

Exemple de projet @ code.qt.io

© 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.