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>
を、リストからそのタイプに対応する正規表現で置き換えます。rule はQHttpServerRouter インスタンスを変更してはならない。
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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。