Einfacher HTTP-Server
Einfaches Beispiel für das Einrichten eines HTTP-Servers.
Der einfache HTTP-Server zeigt, wie man einen HTTP-Server mit der Klasse QHttpServer einrichtet. Er hört auf zwei Sockets: einen TCP-Socket und einen SSL-Socket. Es werden verschiedene Rückrufe eingerichtet, um zu zeigen, wie die Funktion route() verwendet werden kann.
Ein QHttpServer -Objekt wird erstellt, und ein einfaches route() behandelt den Pfad "/"
, indem es Hello world
zurückgibt:
QCoreApplication app(argc, argv); QHttpServer httpServer; httpServer.route("/", []() { return "Hello world"; });
Dann registrieren wir einen Callback, der die Assets des Servers an den Client weiterleitet:
httpServer.route("/assets/<arg>", [] (const QUrl &url) { return QHttpServerResponse::fromFile(u":/assets/"_s + url.path()); });
Hier verwenden wir das Objekt QHttpServerRequest, um die IP-Adresse des Clients zurückzugeben:
httpServer.route("/remote_address", [](const QHttpServerRequest &request) { return request.remoteAddress().toString(); });
Für einen der Pfade, "/auth"
, wird die einfache HTTP-Authentifizierung verwendet:
httpServer.route("/auth", [](const QHttpServerRequest &request) { auto auth = request.value("authorization").simplified(); if (auth.size() > 6 && auth.first(6).toLower() == "basic ") { auto token = auth.sliced(6); auto userPass = QByteArray::fromBase64(token); if (auto colon = userPass.indexOf(':'); colon > 0) { auto userId = userPass.first(colon); auto password = userPass.sliced(colon + 1); if (userId == "Aladdin" && password == "open sesame") return QHttpServerResponse("text/plain", "Success\n"); } } QHttpServerResponse resp("text/plain", "Authentication required\n", QHttpServerResponse::StatusCode::Unauthorized); auto h = resp.headers(); h.append(QHttpHeaders::WellKnownHeader::WWWAuthenticate, R"(Basic realm="Simple example", charset="UTF-8")"); resp.setHeaders(std::move(h)); return std::move(resp); });
Dann verwenden wir die Funktion addAfterRequestHandler(), um das Objekt QHttpServerResponse zu ändern, nachdem es durch die von route() registrierten Rückrufe bearbeitet wurde, indem wir HTTP-Header zur Antwort hinzufügen:
httpServer.addAfterRequestHandler(&httpServer, [](const QHttpServerRequest &, QHttpServerResponse &resp) { auto h = resp.headers(); h.append(QHttpHeaders::WellKnownHeader::Server, "Qt HTTP Server"); resp.setHeaders(std::move(h)); });
Ein QTcpServer, das einen Port abhört, wird mit Hilfe der Funktion bind() an den HTTP-Server gebunden:
auto tcpserver = std::make_unique<QTcpServer>();if (!tcpserver->listen() || !httpServer.bind(tcpserver.get())) { qWarning() << QCoreApplication::translate("QHttpServerExample", "Server konnte nicht auf einem Port lauschen."); return-1; }quint16 port = tcpserver->serverPort(); tcpserver.release();
Und dann wird QSslConfiguration verwendet, um eine SSL-Konfiguration für QHttpServer zu erstellen, um HTTPS-Verkehr zu bedienen:
QSslConfiguration conf = QSslConfiguration::defaultConfiguration();const auto sslCertificateChain =QSslCertificate::fromPath(QStringLiteral(":/assets/certificate.crt"));if (sslCertificateChain.empty()) { qWarning() << QCoreApplication::translate("QHttpServerExample", "Konnte das SSL-Zertifikat nicht aus der Datei abrufen."); return-1; }QFile privateSchlüsselDatei(QStringLiteral(":/assets/private.key"));if (!privateKeyFile.open(QIODevice::ReadOnly)) { qWarning() << QCoreApplication::translate("QHttpServerExample", "Die Datei konnte nicht zum Lesen geöffnet werden: %1") . arg(privateKeyFile.errorString()); return-1; } conf.setLocalCertificate(sslCertificateChain.front()); conf.setPrivateKey(QSslKey(&privateKeyFile, QSsl::Rsa)); privateKeyFile.close();auto sslserver = std::make_unique<QSslServer>(); sslserver->setSslConfiguration(conf);if (!sslserver->listen() || !httpServer.bind(sslserver.get())) { qWarning() << QCoreApplication::translate("QHttpServerExample", "Server konnte nicht auf einem Port lauschen."); return-1; }quint16 sslPort = sslserver->serverPort(); sslserver.release();
Nachdem alles eingerichtet ist, müssen Sie nur noch mit der Bearbeitung eingehender Anfragen beginnen:
return app.exec();
Dateien:
Bilder:
© 2025 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.