QHttpServer Class
QHttpServer ist eine vereinfachte API für QAbstractHttpServer und QHttpServerRouter. Mehr...
Kopfzeile: | #include <QHttpServer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS HttpServer) target_link_libraries(mytarget PRIVATE Qt6::HttpServer) |
qmake: | QT += httpserver |
Seit: | Qt 6.4 |
Erbt: | QAbstractHttpServer |
Öffentliche Funktionen
QHttpServer(QObject *parent = nullptr) | |
virtual | ~QHttpServer() override |
void | addAfterRequestHandler(const QObject *context, Functor &&slot) |
void | clearMissingHandler() |
Rule * | route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *context, Functor &&slot) |
Rule * | route(const QString &pathPattern, Functor &&handler) |
Rule * | route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler) |
Rule * | route(const QString &pathPattern, const QObject *context, Functor &&slot) |
QHttpServerRouter * | router() |
const QHttpServerRouter * | router() const |
void | setMissingHandler(const QObject *context, Functor &&slot) |
Detaillierte Beschreibung
QHttpServer wird verwendet, um einen einfachen HTTP-Server zu erstellen, indem eine Reihe von Request-Handlern registriert wird.
Die Funktion route kann verwendet werden, um auf bequeme Weise Regeln zu QHttpServerRouter des Servers hinzuzufügen. Um einen Handler zu registrieren, der nach jeder Anfrage aufgerufen wird, um die Antwort weiter zu verarbeiten, verwenden Sie addAfterRequestHandler. Dieser Mechanismus funktioniert jedoch nur für Routen, die QHttpServerResponse oder QFuture<QHttpServerResponse>
zurückgeben. Um einen Handler für alle unbehandelten Anfragen zu registrieren, verwenden Sie setMissingHandler.
Minimales Beispiel:
QHttpServer server; server.route("/", [] () { return "hello world"; });auto tcpserver = new QTcpServer();if (!tcpserver->listen() || !server.bind(tcpserver)) { delete tcpserver; return-1;} qDebug() << "Listening on port" << tcpserver->serverPort();
Dokumentation der Mitgliederfunktionen
[explicit]
QHttpServer::QHttpServer(QObject *parent = nullptr)
Erzeugt eine Instanz von QHttpServer mit übergeordnetem parent.
[override virtual noexcept]
QHttpServer::~QHttpServer()
Zerstört eine QHttpServer.
template <typename Functor> void QHttpServer::addAfterRequestHandler(const QObject *context, Functor &&slot)
Registrieren Sie context und slot, die nach jeder Bearbeitung einer Anfrage aufgerufen werden.
Die slot muss die Signatur void (*)(const QHttpServerRequest &, QHttpServerResponse &)
implementieren.
Die slot kann auch ein Funktionszeiger, ein nicht veränderbares Lambda oder eine andere kopierbare aufrufbare Variable mit dem Operator const call sein. In diesem Fall ist context ein Kontextobjekt und der Handler ist gültig, bis das Kontextobjekt zerstört wird.
Beispiel:
server.addAfterRequestHandler(&server, [] (const QHttpServerRequest &req, QHttpServerResponse &resp) { auto h = resp.headers(); h.append(QHttpHeaders::WellKnownHeader::Cookie, "PollyWants=Cracker"); resp.setHeaders(std::move(h)); }
Hinweis: Diese Handler werden nur für Anfragen aufgerufen, die von Route-Handlern verarbeitet werden, die entweder QHttpServerResponse oder QFuture<QHttpServerResponse> zurückgeben und daher kein QHttpServerResponder Argument annehmen.
void QHttpServer::clearMissingHandler()
Setzt den Handler auf den Standard-Handler zurück, der Antworten mit dem Status 404 Not Found
erzeugt.
Siehe auch setMissingHandler.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *context, Functor &&slot)
Diese Methode wird verwendet, um eine neue Rule
zum QHttpServerRouter Mitglied des Servers hinzuzufügen. Der Rule
Template-Parameter kann eine beliebige benutzerdefinierte Klasse sein, die von QHttpServerRouterRule abgeleitet ist. Die Parameter werden an Rule
übergeben. Bei der Bearbeitung der eingehenden HTTP-Anfragen vergleicht QHttpServerRouter die Rule
mit der eingehenden HTTP-Anfrage anhand der URL und der HTTP-Methode, und die erste Übereinstimmung von beiden wird ausgeführt. Der Parameter pathPattern wird mit dem path() der URL der eingehenden Anfrage verglichen. Der Parameter method wird mit der HTTP-Methode der eingehenden Anfrage verglichen.
Der Parameter slot kann ein Zeiger auf eine Mitgliedsfunktion von context sein. Er kann auch ein Funktionszeiger, ein nicht veränderbares Lambda oder eine andere kopierbare aufrufbare Funktion mit dem Operator const call sein. Die Regel ist für die Lebensdauer von context gültig. context muss dieselbe Thread-Affinität haben wie QHttpServer, damit die Registrierung erfolgreich ist und die Regel ausgeführt werden kann.
Der Slot kann seine Antwort mit einer Return-Anweisung ausdrücken. In diesem Fall muss die Funktion QHttpServerResponse oder einen beliebigen Typ zurückgeben, der in QHttpServerResponse konvertiert werden kann. Es gibt eine große Auswahl an Konvertierungskonstruktoren, siehe QHttpServerResponse.
QHttpServer server; server.route("/test/", this, [] () { return ""; });
Alternativ kann ein optionales QHttpServerResponder& Argument angegeben werden; in diesem Fall muss die Antwort mit diesem Argument geschrieben werden und die Funktion muss void
zurückgeben.
server.route("/test2", this, [] (QHttpServerResponder &responder) { responder.write(QHttpServerResponder::StatusCode::Forbidden); });
Die slot kann auch const
QHttpServerRequest & als letzten Parameter haben, oder als vorletzten, wenn QHttpServerResponder& der letzte Parameter ist. Sie enthält detaillierte Informationen über die Anfrage.
server.route("/test3", QHttpServerRequest::Method::Post, this, [] (const QHttpServerRequest &request, QHttpServerResponder &responder) { responder.write(request.body(), "text/plain"_ba); });
slot kann auch eine beliebige Anzahl von kopierbaren Parametern aufnehmen, die die unter QHttpServerRouter::converters() verfügbaren Typen haben können. Standardmäßig sind dies die meisten Integer-Typen, Float, Double, QString, QByteArray und QUrl. Konverter für weitere Typen können durch Aufruf von QHttpServerRouter::addConverter() hinzugefügt werden.
pathPattern kann eine Reihe von "<arg>"
Teilzeichenfolgen enthalten, die von links nach rechts mit den Parametern von slot abgeglichen werden. Die Konverter werden auf der Grundlage der Typen dieser Parameter ausgewählt.
Jedem registrierten Typ ist ein Regex zugeordnet, der zum Abgleichen und Konvertieren von Vorkommen von "<arg>"
in pathPattern verwendet wird. Diese Regex-Muster werden kombiniert, um einen Parser für den gesamten Pfad zu erstellen. Der resultierende Parser wird dann verwendet, um zu überprüfen, ob der Pfad mit dem Muster übereinstimmt. Wenn das Parsing erfolgreich ist, wird die entsprechende Funktion mit den umgewandelten Parametern aufgerufen. Schlägt das Parsen fehl, wird der nächste registrierte Rückruf versucht.
Im folgenden Beispiel wird der Wert im Anforderungspfad, der "<arg>"
ersetzt, in int
umgewandelt, da das Lambda einen Parameter int
erwartet. Wenn eine HTTP-Anforderung mit der Route übereinstimmt, wird der konvertierte Wert an das Argument page
des Lambdas übergeben:
QHttpServer server; server.route("/showpage/<arg>", this, [] (const int page) { return getPage(page); });
Diese Funktion gibt im Erfolgsfall einen Zeiger auf die neu erstellte Regel zurück, andernfalls einen nullptr
. Der Zeiger kann verwendet werden, um Parameter für eine beliebige benutzerdefinierte QHttpServerRouter Klasse zu setzen:
auto rule = server.route<MyRule>("/test4", this, [] () {return "";}); rule->setParameter("test");
Hinweis: Diese Funktion, route, darf nicht von slot aus aufgerufen werden, damit keine route-Handler andere route-Handler registrieren können.
Hinweis: Wenn eine Anfrage von einem slot verarbeitet wurde, der QHttpServerResponder& als Argument akzeptiert, wird keiner der nachfolgenden Request-Handler (siehe addAfterRequestHandler) aufgerufen.
Anfragen werden standardmäßig sequentiell innerhalb des Threads von QHttpServer verarbeitet. Der Request-Handler kann QFuture<QHttpServerResponse>
zurückgeben, wenn eine gleichzeitige Verarbeitung gewünscht ist:
server.route("/feature/<arg>", [] (int ms) { return QtConcurrent::run([ms] () { QThread::msleep(ms); return QHttpServerResponse("the future is coming"); }); });
Das Lambda von QtConcurrent::run() wird parallel ausgeführt, aber die gesamte Netzwerkkommunikation wird sequentiell in dem Thread ausgeführt, zu dem QHttpServer
gehört, nachdem QFuture fertig ist. Beachten Sie, dass jedes QHttpServerRequest Objekt per Referenz an den Callback übergeben wird. Extrahieren Sie alle benötigten Inhalte, bevor QtConcurrent::run() aufgerufen wird.
Das spezielle Argument QHttpServerResponder& ist nur für Routen verfügbar, die void
zurückgeben. Bei Verwendung eines Responder-Objekts wird die Antwort über dieses Objekt zurückgegeben.
Siehe auch QHttpServerRouter::addRule und addAfterRequestHandler.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, Functor &&handler)
Dies ist eine überladene Funktion.
Überladung von QHttpServer::route zur Erstellung einer Regel für pathPattern und QHttpServerRequest::Method::AnyKnown. Alle Anfragen werden an handler weitergeleitet, das ein Funktionszeiger, ein nicht veränderbares Lambda oder eine andere kopierbare aufrufbare Variable mit const call Operator sein kann. Die Regel ist so lange gültig, bis die QHttpServer zerstört wird.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)
Dies ist eine überladene Funktion.
Überladung von QHttpServer::route zur Erstellung einer Regel für pathPattern und method. Alle Anfragen werden an handler weitergeleitet, das ein Funktionszeiger, ein nicht veränderbares Lambda oder eine andere kopierbare aufrufbare Variable mit const call Operator sein kann. Die Regel ist so lange gültig, bis die QHttpServer zerstört wird.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *context, Functor &&slot)
Dies ist eine überladene Funktion.
Überladung von QHttpServer::route, um eine Regel für pathPattern und die Methode QHttpServerRequest::Method::AnyKnown zu erstellen. Alle Anfragen werden an context und slot weitergeleitet.
QHttpServerRouter *QHttpServer::router()
Gibt einen Zeiger auf das Router-Objekt zurück.
const QHttpServerRouter *QHttpServer::router() const
Gibt einen Zeiger auf das konstante Router-Objekt zurück.
template <typename Functor> void QHttpServer::setMissingHandler(const QObject *context, Functor &&slot)
Legen Sie einen Handler für unbehandelte Anfragen fest.
Alle unbehandelten Anfragen werden an den context's slot weitergeleitet.
Die slot muss die Signatur void (*)(const QHttpServerRequest &, QHttpServerResponder &)
implementieren. Die slot kann auch ein Funktionszeiger, ein nicht veränderbares Lambda oder eine andere kopierbare aufrufbare Variable mit dem Operator const call sein. In diesem Fall ist die context ein Kontextobjekt. Der Handler ist so lange gültig, bis das Kontextobjekt zerstört wird.
Der Standard-Handler antwortet mit dem Status 404 Not Found
.
Siehe auch clearMissingHandler.
© 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.