QHttpServerRouter 类
提供将 URL 绑定到 ViewHandler
的函数。 更多...
头文件 | #include <QHttpServerRouter> |
CMake | find_package(Qt6 REQUIRED COMPONENTS HttpServer) target_link_libraries(mytarget PRIVATE Qt6::HttpServer) |
qmake | QT += httpserver |
自 | Qt 6.4 |
状态 | 技术预览 |
公共函数
QHttpServerRouter() | |
~QHttpServerRouter() | |
bool | addConverter(QAnyStringView regexp) |
void | addConverter(QMetaType metaType, QAnyStringView regexp) |
bool | addRule(std::unique_ptr<QHttpServerRouterRule> rule) |
typename ViewTraits::BindableType | bindCaptured(ViewHandler &&handler, const QRegularExpressionMatch &match) const |
void | clearConverters() |
const QHash<QMetaType, QString> & | converters() const |
bool | handleRequest(const QHttpServerRequest &request, QHttpServerResponder &responder) const |
void | removeConverter(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
。
自动尝试注册从 QString 到 Type 的隐式转换器。如果已经存在类型 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. 的商标。所有其他商标均为各自所有者的财产。