QHttpServerRouter 类

提供将 URL 绑定到 ViewHandler 的函数。 更多...

头文件 #include <QHttpServerRouter>
CMakefind_package(Qt6 REQUIRED COMPONENTS HttpServer)
target_link_libraries(mytarget PRIVATE Qt6::HttpServer)
qmakeQT += httpserver
Qt 6.4
状态技术预览

公共函数

QHttpServerRouter()
~QHttpServerRouter()
booladdConverter(QAnyStringView regexp)
voidaddConverter(QMetaType metaType, QAnyStringView regexp)
booladdRule(std::unique_ptr<QHttpServerRouterRule> rule)
typename ViewTraits::BindableTypebindCaptured(ViewHandler &&handler, const QRegularExpressionMatch &match) const
voidclearConverters()
const QHash<QMetaType, QString> &converters() const
boolhandleRequest(const QHttpServerRequest &request, QHttpServerResponder &responder) const
voidremoveConverter(QMetaType metaType)

详细描述

您可以注册 ViewHandler 作为对特定 URL 请求的回调。路由中的可变部分可以通过 ViewHandler 中的参数指定。

注意:这是一个 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.addRoute<ViewHandler>(
    new QHttpServerRouterRule("/page/", [=] (QRegularExpressionMatch &match,
                                             const QHttpServerRequest &,
                                             QHttpServerResponder &&) {
    auto boundView = router.bindCaptured(pageView, match);

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

成员函数文档

QHttpServerRouter::QHttpServerRouter()

使用默认转换器创建一个 QHttpServerRouter 对象。

另请参阅converters().

[noexcept] QHttpServerRouter::~QHttpServerRouter()

销毁一个 QHttpServerRouter

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

为类型 Type 添加一个新转换器,该转换器与正则表达式 regexp 匹配,如果成功将返回 true,否则返回 false

自动尝试注册从 QStringType 的隐式转换器。如果已经存在类型 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>/<arg>/log",
    [&router, &pageView] (QRegularExpressionMatch &match,
                          const QHttpServerRequest &request,
                          QHttpServerResponder &&responder) {
    // Bind and call viewHandler with match's captured string and quint32:
    router.bindCaptured(pageView, match)();
});

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

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

为类型 metaType 添加一个新的转换器,匹配正则表达式 regexp

如果已经存在类型为 metaType 的转换器,则该转换器的正则表达式将被 regexp 替换。

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

添加一个新的 规则 并在成功时返回 true

在 addRule 中,我们确定 ViewHandler 参数并生成其 QMetaType::Type id 列表。然后我们解析 URL 并将每个 <arg> 替换为其类型列表中的正则表达式。

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));

template <typename ViewHandler, typename ViewTraits = QHttpServerRouterViewTraits<ViewHandler>> typename ViewTraits::BindableType QHttpServerRouter::bindCaptured(ViewHandler &&handler, const QRegularExpressionMatch &match) const

将来自 URL 的参数提供给 handler。返回绑定函数,该函数接受 handler 可能接受的任何其他参数,并在 URL 提取的值之后将其提供给 handler。对 URL(作为字符串)应用的正则表达式中的每次匹配都转换为 handler 参数在其位置的类型,以便将其作为 match 传递。

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) {
    // Bind and call viewHandler with match's captured string and quint32:
    router.bindCaptured(pageView, match)();
});

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

void QHttpServerRouter::clearConverters()

删除所有转换器。

注意:clearConverters() 不会设置默认转换器。

另请参阅converters().

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

返回转换器类型和正则表达式的映射。

以下是一些默认可用的转换器

常量描述
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一个空的转换器。

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

使用 responder 处理 HTTP 服务器接收到的每个新的 请求

遍历规则列表以找到第一个匹配的规则,然后执行该规则,返回 true。如果没有规则匹配请求,则返回 false

void QHttpServerRouter::removeConverter(QMetaType metaType)

删除类型为 metaType 的转换器。

© 2024 The Qt Company Ltd. 本文档中包含的贡献内容均为各自所有者的版权。提供的文档受 GNU 自由文档许可证第 1.3 版许可,由自由软件基金会发布。Qt 及其相关标志是芬兰及全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为各自所有者的财产。