PySide6.QtHttpServer.QHttpServerRouterRule

class QHttpServerRouterRule

QHttpServerRouterRuleQHttpServerRouter 规则的基类。更多

概要

方法

虚拟方法

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

QHttpServerRouterRule 表示请求路径、HTTP请求方法和相应的处理程序回调之间的连接。QHttpServerRouter 是这些规则的集合,如果路径和请求方法与请求匹配,则调用处理程序。处理程序回调必须提供对请求的响应。

路径和模式

每个QHttpServerRouterRule包含一个路径或路径模式,该路径或路径模式定义了它可以通过其处理程序提供响应的路径。路径可以包含占位符,这些占位符会被转发到规则的处理程序。以下路径模式的示例使用route便捷方法显示,但也可以提供给QHttpServerRouterRule构造函数。

在最简单的情况下,路径是一个以“/”开头的字符串:

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

此路径模式创建了一个规则,将所有带有“/user”的请求转发到提供的处理程序,在本例中是一个简单的lambda(请注意,当直接使用QHttpServerRouterRule时,处理程序的语法会有所不同,见下文)。

路径模式可以进一步包含一个尾随的“/”,以创建一个规则,该规则处理尾随“/”后带有参数的路径集合。参数将作为QRegularExpressionMatch转发给Rule。使用route便捷方法,参数直接转发给lambda:

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

这将匹配请求URL“/user/1”、“/user/2”等。

参数可以通过使用“”占位符在路径模式中自由定位。此关键字还允许多个占位符。

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

例如,这将匹配请求URL“/user/1/history/2”。所有在converters()中注册的类型都可以在回调函数和相应的占位符中使用。

请求方法

请求方法仅仅是Method中的一个。如果没有为Rule构造的任何重载提供方法,则该规则将匹配任何请求方法。

处理程序签名

处理程序是一个具有签名的回调函数

void (*)(const QRegularExpressionMatch &, const QHttpServerRequest &, QHttpServerResponder &);

处理程序回调接收任何匹配的占位符作为其第一个参数。第二个参数包含有关请求的详细信息,响应必须由处理程序在最后一个参数上写入。

以下代码示例展示了如何创建具有相应处理程序的新规则并将其添加到QHttpServerRouter中:

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);
        // call viewHandler
        boundViewHandler();
    });

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

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

注意

这是一个低级API,有关更高级的替代方案,请参见QHttpServer

注意

路径模式中的正则表达式不受支持,但可以使用addConverter()注册(将“”的使用匹配到特定类型)。

contextObject()
Return type:

QObject

返回此规则的上下文对象。这是必须处理请求的接收者。

exec(request, responder)
Parameters:
Return type:

布尔

为给定的request执行此规则。

此函数由QHttpServerRouter在接收到新请求时调用。如果给定的request匹配此规则,此函数通过向给定的responder传递响应来处理请求,然后返回true。否则,返回false

hasValidMethods()
Return type:

布尔

如果方法有效,则返回 true

matches(request, match)
Parameters:
Return type:

布尔

确定给定的request是否匹配此规则。

这个虚函数由exec()调用,用于检查request是否匹配此规则。如果找到匹配项,它将被存储在match指向的对象中(该对象不能None),并且此函数返回true。否则,返回false