HTTP-Client

Veranschaulicht einen einfachen HTTP-Client.

Dieses Beispiel zeigt, wie ein einfacher HTTP-Client Dateien von Remote-Hosts abrufen kann.

Der Benutzer gibt im Hauptfenster die URL, den Dateinamen und den Speicherort für den Download ein. Die Klasse „QNetworkAccessManager“ nutzt diese Informationen, um die Datei herunterzuladen.

Die Hauptarbeit dieses Beispiels wird in der Klasse `HttpWindow` erledigt. Daher werden wir uns darauf konzentrieren.

QNetworkRequest networkRequest(url);
networkRequest.setTcpKeepAliveIdleTimeBeforeProbes(20s);
networkRequest.setTcpKeepAliveIntervalBetweenProbes(2s);
networkRequest.setTcpKeepAliveProbeCount(5);

Seit Qt 6.11 ist es möglich, die TCP-Keepalive-Parameter für einen „ QNetworkRequest “ explizit festzulegen. Im obigen Codeausschnitt überschreiben wir die von „ QNetworkAccessManager “ verwendeten Standardwerte, um eine aggressivere Strategie zu verfolgen. Dies kann beispielsweise bei der frühzeitigen Erkennung von Netzwerkblockaden nützlich sein, die durch Netzwerkänderungen unter Linux verursacht werden. In diesem speziellen Beispiel wird die Verbindung nach dreißig Sekunden Inaktivität geschlossen.

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

Mit ` QNetworkAccessManager` starten wir den Download einer Ressource, auf die ` url` verweist. Falls Sie mit dieser Funktion oder der verwendeten Methode ` QNetworkAccessManager::get()` noch nicht vertraut sind oder sich einfach näher damit befassen möchten, werfen Sie einen Blick in die Dokumentation sowie in die Dokumentation zu ` QNetworkReply ` und ` 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

Oben verbinden wir einige der Signale der Antwort mit Slots in der Klasse. Diese Slots kümmern sich sowohl um eingehende Daten als auch um den Abschluss des Downloads und die Behandlung von Fehlern.

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

Was die Verarbeitung der eingehenden Daten betrifft: Da wir die maximale Download-Größe einer möglichen Eingabe nicht kennen und den Arbeitsspeicher eines Computers, auf dem das Beispielprogramm ausgeführt wird, nicht überlasten wollen, verarbeiten wir die eingehenden Daten in ` QNetworkReply::readyRead()` statt in ` 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());
}

Anschließend schreiben wir die Daten sofort nach ihrem Eintreffen in eine Datei. Das ist zwar weniger komfortabel, aber die Anwendung verbraucht in Spitzenzeiten weniger Speicher!

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

Mit dem Signal ` QNetworkReply::sslErrors()` können wir auch Fehler behandeln, die während des TLS-Handshakes bei der Verbindung zu sicheren Websites (d. h. HTTPS) auftreten können.

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();
    }
}

In diesem Beispiel zeigen wir dem Benutzer ein Dialogfeld an, damit er entscheiden kann, ob er die Fehler ignorieren möchte oder nicht.

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;
}

Tritt ein Fehler auf, gibt ` QNetworkReply ` das Signal ` QNetworkReply::errorOccurred()` aus, gefolgt vom Signal ` QNetworkReply::finished()`. In diesem Beispiel binden wir uns nur an Letzteres an. Wir behandeln mögliche Fehler im jeweiligen Slot, indem wir die Datei löschen, in die wir gerade geschrieben haben, und zeigen den Fehler über unser Status-Label an.

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

Wenn Sie eine Verbindung zu einer Website herstellen, die HTTP-Authentifizierung verwendet, und Sie die erforderlichen Anmeldedaten nicht im Voraus angegeben haben, können Sie fehlende Anmeldedaten behandeln, sobald die Website diese anfordert. Mit ` QNetworkAccessManager` tun wir dies in einem Slot, der mit dem Signal ` QNetworkAccessManager::authenticationRequired()` verbunden ist. Diese Verbindung stellen wir einmalig im Konstruktor her.

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());
    }
}

In diesem Beispiel zeigen wir einen Dialog an, in dem der Benutzer entweder einen Benutzernamen und ein Passwort eingeben oder den Vorgang abbrechen kann. Ein Abbruch führt dazu, dass die Anfrage fehlschlägt.

Beispielprojekt @ 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.