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 fügt ein neues Routing Rule
zum QHttpServerRouter Member des Servers hinzu. Der Schablonenparameter Rule
kann eine beliebige von QHttpServerRouterRule abgeleitete Klasse sein. Die Parameter werden an Rule
übergeben. Der Server vergleicht eingehende HTTP-Anfragen mit registrierten Regeln, die auf dem URL-Pfad und der HTTP-Methode basieren, 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 ist der Request-Handler. Er kann ein Zeiger auf eine Mitgliedsfunktion von context, ein Funktionszeiger, ein nicht veränderbares Lambda oder eine kopierbare aufrufbare Funktion mit einem const-Aufrufoperator sein. Wenn context angegeben wird, bleibt die Regel so lange gültig, wie der Kontext existiert. context muss die gleiche Thread-Affinität haben wie QHttpServer.
Die slot nimmt als Argumente eine beliebige Anzahl von geparsten Argumenten, die aus der pathPattern durch Übereinstimmung mit den "<arg>"
Platzhaltern extrahiert werden, gefolgt von einem optionalen QHttpServerRequest und einem optionalen QHttpServerResponder. Diese beiden Klassen werden als "specials" bezeichnet.
Die slot kann einen QHttpServerResponse oder einen konvertierbaren Typ zurückgeben:
QHttpServer server; server.route("/test/", this, [] () { return ""; });
Wenn alternativ ein optionales QHttpServerResponder& Argument angegeben wird, muss die Antwort damit geschrieben werden und die Funktion muss void
zurückgeben.
server.route("/test2", this, [] (QHttpServerResponder &responder) { responder.write(QHttpServerResponder::StatusCode::Forbidden); });
Das Objekt QHttpServerRequest kann für den Zugriff auf den Körper der Anfrage verwendet werden:
server.route("/test3", QHttpServerRequest::Method::Post, this, [] (const QHttpServerRequest &request, QHttpServerResponder &responder) { responder.write(request.body(), "text/plain"_ba); });
Jeder Platzhalter ( "<arg>"
) in pathPattern wird automatisch konvertiert, um den Argumenttypen des Handlers zu entsprechen. Zu den unterstützten Typen gehören Ganzzahlen, Gleitkommazahlen, QString, QByteArray und QUrl. Die Klasse QUrl kann als letzter Parameter verwendet werden, um das Ende der pathPattern zu behandeln, und durch Aufteilung kann eine beliebige Anzahl von Argumenten unterstützt werden. Benutzerdefinierte Konverter können mit QHttpServerRouter::addConverter() hinzugefügt werden.
Jedem registrierten Typ ist ein Regex zugeordnet, der zum Abgleichen und Konvertieren von Platzhaltern in der 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 Parsing fehl, wird der nächste registrierte Rückruf versucht. Schlägt das Parsing für alle Rückrufe fehl, wird der missingHandler aufgerufen.
Im folgenden Beispiel wird der Wert im Anforderungspfad, der "<arg>"
ersetzt, in int
umgewandelt, da das Lambda einen Parameter int
erwartet. Wenn eine HTTP-Anfrage mit der Route übereinstimmt, wird der konvertierte Wert an das Argument page
des Lambdas übergeben:
QHttpServer server; server.route("/showpage/<arg>", this, [] (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)
Ü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.
Dies ist eine überladene Funktion.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)
Ü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.
Dies ist eine überladene Funktion.
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *context, Functor &&slot)
Ü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.
Dies ist eine überladene Funktion.
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.