QHttpServerRouter Class

URL をViewHandler にバインドする関数を提供する

Header: #include <QHttpServerRouter>
CMake: find_package(Qt6 REQUIRED COMPONENTS HttpServer)
target_link_libraries(mytarget PRIVATE Qt6::HttpServer)
qmake: QT += httpserver
Since: Qt 6.4
Status: Technical Preview

パブリック関数

QHttpServerRouter(QAbstractHttpServer *server)
~QHttpServerRouter()
bool addConverter(QAnyStringView regexp)
void addConverter(QMetaType metaType, QAnyStringView regexp)
QHttpServerRouterRule *addRule(std::unique_ptr<QHttpServerRouterRule> rule)
void clearConverters()
QHash<QMetaType, QString> converters() &&
const QHash<QMetaType, QString> &converters() const &
bool handleRequest(const QHttpServerRequest &request, QHttpServerResponder &responder) const
void removeConverter(QMetaType metaType)

詳細説明

QHttpServerRouter は、ルールベースのシステムで http リクエストをそれぞれのハンドラに振り分けるためのクラスです。

リクエストパスとそれぞれのハンドラを表すQHttpServerRouterRules を新しく登録することができます。リクエストパスのプレースホルダでルート内の可変部分を指定できます。ハンドラはプレースホルダーの値をQRegularExpressionMatch として取得します。 引数はconverter が利用可能な任意の型にすることができます。ハンドラの作成はQHttpServerRouterRule::bindCaptured で簡略化できます。QHttpServerRouter インスタンスは、そのルールによって変更されてはいけません。

注意: これは HTTP サーバの低レベルルーティング API です。

最小限の例です:

auto pageView = [] (const quint64 page) {
    qDebug() << "page" << page;
};
using ViewHandler = decltype(pageView);

QHttpServerRouter router;

// register callback pageView on request "/page/<number>"
// for example: "/page/10", "/page/15"
router.addRule<ViewHandler>(
    new QHttpServerRouterRule("/page/", [=] (QRegularExpressionMatch &match,
                                             const QHttpServerRequest &,
                                             QHttpServerResponder &&) {
    auto boundView = QHttpServerRouterRule::bindCaptured(pageView, match);

    // it calls pageView
    boundView();
}));

メンバ関数ドキュメント

QHash<QMetaType, QString> QHttpServerRouter::converters() &&

const QHash<QMetaType, QString> &QHttpServerRouter::converters() const &

このQHttpServerRouter に登録されているコンバータ型と正規表現のマップを返します。これらはQHttpServerRouterRules のパスパターンで使用できる型です。

デフォルトでは以下のコンバータが使用可能です:

定数説明
QMetaType::Int
QMetaType::Long
QMetaType::LongLong
QMetaType::Short
QMetaType::UInt
QMetaType::ULong
QMetaType::ULongLong
QMetaType::UShort
QMetaType::Double
QMetaType::Float
QMetaType::QString
QMetaType::QByteArray
QMetaType::QUrl
QMetaType::Void空のコンバータ。

addConverter およびclearConvertersも参照して ください。

QHttpServerRouter::QHttpServerRouter(QAbstractHttpServer *server)

デフォルトのコンバータを持つ QHttpServerRouter オブジェクトを作成します。

converters参照して ください。

[noexcept] QHttpServerRouter::~QHttpServerRouter()

QHttpServerRouter を破棄します。

template <typename Type> bool QHttpServerRouter::addConverter(QAnyStringView regexp)

regexp で解析できるTypeの新しいコンバータを追加し、成功した場合はtrue を返し、失敗した場合はfalse を返します。成功した場合、登録された型はQHttpServerRouterRule のハンドラの引数として使用できる。正規表現は、ルールのパスパターンを解析するために使用される。

Type型のコンバーターがすでに存在する場合、そのコンバーターの正規表現はregexp に置き換えられる。

最小の例:

struct CustomArg {
    int data = 10;

    CustomArg() {} ;
    CustomArg(const QString &urlArg) : data(urlArg.toInt()) {}
};
Q_DECLARE_METATYPE(CustomArg);

QHttpServerRouter router;
router.addConverter<CustomArg>(u"[+-]?\\d+"));

auto pageView = [] (const CustomArg &customArg) {
    qDebug("data: %d", customArg.data);
};
using ViewHandler = decltype(pageView);

auto rule = std::make_unique<QHttpServerRouterRule>(
    "/<arg>/log",
    [&router, &pageView] (QRegularExpressionMatch &match,
                          const QHttpServerRequest &request,
                          QHttpServerResponder &&responder) {
    // Bind and call viewHandler with match's captured string and quint32:
    QHttpServerRouterRule::bindCaptured(pageView, match)();
});

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

void QHttpServerRouter::addConverter(QMetaType metaType, QAnyStringView regexp)

regexp でパースできるmetaType の新しいコンバータを追加します。metaType のコンバータを持つことで、この型をQHttpServerRouterRule のパスパターンで使用できるようになります。 正規表現は、パスパターンからmetaType 型のパラメータをパースするために使用されます。

すでにmetaType 型のコンバーターがある場合、そのコンバーターの正規表現はregexp に置き換えられます。

converters およびclearConvertersも参照してください

template <typename ViewHandler, typename ViewTraits = QHttpServerRouterViewTraits<ViewHandler>> QHttpServerRouterRule *QHttpServerRouter::addRule(std::unique_ptr<QHttpServerRouterRule> rule)

新しいrule をルータに追加します。

成功した場合は新しいルールへのポインタを返し、失敗した場合はnullptr を返す。

addRuleの内部で、ViewHandlerの引数を決定し、それらのQMetaType::Type IDのリストを生成します。次に、URLを解析し、<arg> を、リストからそのタイプに対応する正規表現で置き換えます。ruleQHttpServerRouter インスタンスを変更してはならない。

QHttpServerRouter router;

using ViewHandler = decltype([] (const QString &page, const quint32 num) { });

auto rule = std::make_unique<QHttpServerRouterRule>(
    "/<arg>/<arg>/log",
    [] (QRegularExpressionMatch &match,
        const QHttpServerRequest &request,
        QHttpServerResponder &&responder) {
});

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

void QHttpServerRouter::clearConverters()

すべてのコンバーターを削除する。

注意: clearConverters() は、デフォルトのコンバータを設定しません。

converters およびaddConverterも参照してください

bool QHttpServerRouter::handleRequest(const QHttpServerRequest &request, QHttpServerResponder &responder) const

responder を使用して、HTTP サーバの新しいrequest をそれぞれ処理します。

ルールのリストを繰り返し、最初にマッチするルールを見つけ、そのルールを実行してtrue を返す。リクエストにマッチするルールがない場合はfalse を返す。

void QHttpServerRouter::removeConverter(QMetaType metaType)

metaType 型のコンバータを削除します。

addConverterも参照してください

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。