Auf dieser Seite

QHttpServerRouterRule Class

Die Klasse „QHttpServerRouterRule“ ist die Basisklasse für „ QHttpServerRouter “-Regeln. Mehr dazu...

Header: #include <QHttpServerRouterRule>
CMake: find_package(Qt6 REQUIRED COMPONENTS HttpServer)
target_link_libraries(mytarget PRIVATE Qt6::HttpServer)
qmake: QT += httpserver
Seit: Qt 6.4

Öffentliche Funktionen

QHttpServerRouterRule(const QString &pathPattern, const QHttpServerRequest::Methods methods, const QObject *receiver, Functor &&slot)
QHttpServerRouterRule(const QString &pathPattern, const QObject *receiver, Functor &&slot)
virtual ~QHttpServerRouterRule()
const QObject *contextObject() const

Statische öffentliche Mitglieder

typename ViewTraits::BindableType bindCaptured(QObject *receiver, Functor &&slot, const QRegularExpressionMatch &match)

Geschützte Funktionen

bool exec(const QHttpServerRequest &request, QHttpServerResponder &responder) const
bool hasValidMethods() const
virtual bool matches(const QHttpServerRequest &request, QRegularExpressionMatch *match) const

Ausführliche Beschreibung

QHttpServerRouterRule definiert die Beziehung zwischen einem Anforderungspfad, einer HTTP-Methode und dem entsprechenden Handler-Callback. Ein „ QHttpServerRouter “ ist eine Sammlung dieser Regeln, die den entsprechenden Handler ausführt, wenn eine Anforderung sowohl dem Pfad als auch der Methode entspricht. Der Handler ist für die Generierung der Antwort verantwortlich.

Pfade und Muster

Jede `QHttpServerRouterRule` enthält einen Pfad oder ein Muster, das bestimmt, welche Anfragen sie verarbeiten kann. Pfade können Platzhalter enthalten, die an den Handler übergeben werden. Die folgenden Beispiele veranschaulichen Pfadmuster unter Verwendung der Komfortmethode ` QHttpServer::route()`; sie können jedoch auch über den Konstruktor von `QHttpServerRouterRule` festgelegt werden.

Im einfachsten Fall ist der Pfad eine Zeichenkette, die mit „ "/" “ beginnt:

QHttpServer server;
server.route("/user", [] () { return "hello user"; } );

Dieses Pfadmuster definiert eine Regel, die alle Anfragen an „ "/user" “ an den angegebenen Handler weiterleitet, bei dem es sich in diesem Fall um eine einfache Lambda-Funktion handelt. (Beachten Sie, dass sich die Syntax des Handlers bei direkter Verwendung von `QHttpServerRouterRule` unterscheidet – siehe unten.)

Ein abschließendes „ "/" “ im Pfadmuster ermöglicht es der Regel, zusätzliche Pfade mit Argumenten nach dem „ "/" “ abzugleichen. Bei Verwendung der Komfortmethode „ QHttpServer::route()“ wird das Argument automatisch an die Lambda-Funktion übergeben:

server.route("/user/", [] ( qint64 id ) { return "hello user"; } );

Dies würde Anfragepfade wie "/user/1", "/user/2" usw. abdecken.

Argumente im Pfad erfassen

Mithilfe der Platzhalter ` "<arg>" ` können Sie Argumente an beliebiger Stelle im Pfadmuster platzieren; dabei werden mehrere Platzhalter im Pfad unterstützt:

server.route("/user/<arg>/history", [] (qint64 id){ return "hello user"; } );
server.route("/user/<arg>/history/", [] (qint64 id, qint64 page){ return "hello user"; } );

Dies würde beispielsweise eine Anfrage wie "/user/1/history/2" abdecken. Jeder in QHttpServerRouter::converters() registrierte Datentyp kann sowohl in der Callback-Funktion als auch in den entsprechenden Platzhaltern im Pfad verwendet werden.

Anfragemethode

Die Anfragemethode entspricht einem der Werte unter QHttpServerRequest::Method. Wird beim Erstellen einer Regel keine Methode angegeben, passt sie auf Anfragen mit jeder bekannten Methode.

Handler-Signatur

Ein Handler ist eine Callback-Funktion mit der folgenden Signatur:

  • Das erste Argument empfängt alle übereinstimmenden Erfassungsgruppen aus dem Pfad.
  • Das zweite Argument enthält Details zur Anfrage.
  • Das dritte Argument dient zum Senden der Antwort.

Hinzufügen von Regeln zum QHttpServerRouter

Das folgende Beispiel zeigt, wie man eine neue Regel mit einem Handler in „ QHttpServerRouter “ erstellt und registriert:

template<typename ViewHandler>
void route(const char *path, const QHttpServerRequest::Methods methods, ViewHandler &&viewHandler)
{
    auto rule = std::make_unique<QHttpServerRouterRule>(
            path, methods, [this, viewHandler = std::forward<ViewHandler>(viewHandler)]
                                            (QRegularExpressionMatch &match,
                                             const QHttpServerRequest &request,
                                             QHttpServerResponder &responder) mutable {
        auto boundViewHandler = QHttpServerRouterRule::bindCaptured<ViewHandler>(
                this, std::move(viewHandler), match);
        boundViewHandler(); // Execute the handler
    });

    // Add rule to the router
    router.addRule<ViewHandler>(std::move(rule));
}

// Valid:
route("/user/", [] (qint64 id) { } );                            // Matches "/user/1", "/user/3", etc.
route("/user/<arg>/history", [] (qint64 id) { } );               // Matches "/user/1/history", "/user/2/history"
route("/user/<arg>/history/", [] (qint64 id, qint64 page) { } ); // Matches "/user/1/history/1", "/user/2/history/2"

Hinweis: Dies ist eine Low-Level-API. Alternativen auf höherer Ebene finden Sie unter QHttpServer.

Hinweis: Reguläre Ausdrücke werden in Pfadmustern nicht unterstützt, Sie können jedoch QHttpServerRouter::addConverter() verwenden, um "<arg>" einem bestimmten Typ zuzuordnen.

Dokumentation zu Mitgliedsfunktionen

template <typename Functor> QHttpServerRouterRule::QHttpServerRouterRule(const QString &pathPattern, const QHttpServerRequest::Methods methods, const QObject *receiver, Functor &&slot)

Erstellt eine Routing-Regel für pathPattern und methods und verbindet diese mit den angegebenen Adressen receiver und slot.

  • slot kann ein Funktionszeiger, ein unveränderliches Lambda oder ein beliebiges anderes kopierbares, aufrufbares Objekt mit einem Aufrufoperator const sein.
  • Wenn ` slot ` aufrufbar ist, fungiert ` receiver ` als dessen Kontextobjekt.
  • Der Handler bleibt gültig, bis „ receiver “ zerstört wird.

Die Regel kann jede beliebige Kombination der verfügbaren HTTP-Methoden verarbeiten.

Siehe auch QHttpServerRequest::Methods.

template <typename Functor> QHttpServerRouterRule::QHttpServerRouterRule(const QString &pathPattern, const QObject *receiver, Functor &&slot)

Diese Überladung erstellt eine Weiterleitungsregel für pathPattern und ordnet sie receiver und slot zu.

  • Standardmäßig ist „ QHttpServerRequest::Method::AnyKnown “ eingestellt, was bedeutet, dass jede erkannte HTTP-Methode abgeglichen wird.
  • slot kann ein Funktionszeiger, ein nicht veränderbares Lambda oder ein beliebiges anderes kopierbares, aufrufbares Objekt mit dem Aufrufoperator const sein.
  • Ist „ slot “ aufrufbar, fungiert „ receiver “ als dessen Kontextobjekt.
  • Der Handler bleibt gültig, bis „ receiver “ zerstört wird.

Dies ist eine überladene Funktion.

[virtual noexcept] QHttpServerRouterRule::~QHttpServerRouterRule()

Löscht einen ` QHttpServerRouterRule`.

[static] template <typename Functor, typename ViewTraits = QHttpServerRouterViewTraits<Functor>> typename ViewTraits::BindableType QHttpServerRouterRule::bindCaptured(QObject *receiver, Functor &&slot, const QRegularExpressionMatch &match)

Bindet die angegebenen Funktionen „ receiver “ und „ slot “ mit den aus der URL extrahierten Argumenten. Die Funktion gibt ein gebundenes aufrufbares Objekt zurück, das alle verbleibenden, vom Handler benötigten Argumente entgegennimmt und diese nach den aus der URL abgeleiteten Werten an „ slot “ übergibt.

Jeder aus der URL erfasste Wert (als Zeichenkette) wird im Handler entsprechend seiner Position in den entsprechenden Parametertyp konvertiert, um sicherzustellen, dass er als ` match` übergeben werden kann.

QHttpServerRouter router;

auto pageView = [] (const QString&page, const quint32 num) {
    qDebug("page: %s, num: %d", qPrintable(page), num);
};
using ViewHandler = decltype(pageView);

auto rule = std::make_unique<QHttpServerRouterRule>(
    "/<arg>/<arg>/log",
    [&router, &pageView] (QRegularExpressionMatch&match,
                          const QHttpServerRequest&request,
                          QHttpServerResponder&&responder) {
    // Binde den ViewHandler und rufe ihn mit der erfassten Zeichenkette und dem „quint32“-Wert des Matches auf:
    QHttpServerRouterRule::bindCaptured(pageView, match)();
});

router.addRule<ViewHandler>(std::move(rule));

const QObject *QHttpServerRouterRule::contextObject() const

Ruft das dieser Regel zugeordnete Kontext-Objekt ab. Dieses Objekt dient als Empfänger, der für die Bearbeitung der Anfrage zuständig ist.

[protected] bool QHttpServerRouterRule::exec(const QHttpServerRequest &request, QHttpServerResponder &responder) const

Führt die Regel aus. Verarbeitet die angegebene request, indem geprüft wird, ob sie dieser Regel entspricht.

  • Diese Funktion wird von QHttpServerRouter aufgerufen, wenn ein neuer request empfangen wird.
  • Wenn der „ request “ mit der Regel übereinstimmt, bearbeitet er die Anfrage, indem er eine Antwort über den angegebenen „ responder “ sendet, und gibt „ true “ zurück.
  • Wenn keine Übereinstimmung vorliegt, wird ` false` zurückgegeben.

[protected] bool QHttpServerRouterRule::hasValidMethods() const

Überprüft die Anfrage-Methode. Gibt „ true “ zurück, wenn die angegebene HTTP-Methode gültig ist.

[virtual protected] bool QHttpServerRouterRule::matches(const QHttpServerRequest &request, QRegularExpressionMatch *match) const

Prüft, ob das angegebene request die Bedingungen dieser Regel erfüllt.

  • Diese virtuelle Funktion wird von ` exec()` aufgerufen, um die ` request` auszuwerten.
  • Wenn die Anfrage übereinstimmt, werden die Details in ` match ` gespeichert (das nicht ` nullptr` sein darf ), und die Funktion gibt ` true` zurück.
  • Andernfalls gibt sie false zurück.

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