QHttpServer Class
QHttpServer 是一个用于QAbstractHttpServer 和QHttpServerRouter 的简化 API。更多
头文件: | #include <QHttpServer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS HttpServer) target_link_libraries(mytarget PRIVATE Qt6::HttpServer) |
qmake: | QT += httpserver |
自 | Qt 6.4 |
继承于 | QAbstractHttpServer |
公共函数
QHttpServer(QObject *parent = nullptr) | |
virtual | ~QHttpServer() override |
void | addAfterRequestHandler(const QObject *context, Functor &&slot) |
void | clearMissingHandler() |
Rule * | route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *context, Functor &&slot) |
Rule * | route(const QString &pathPattern, Functor &&handler) |
Rule * | route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler) |
Rule * | route(const QString &pathPattern, const QObject *context, Functor &&slot) |
QHttpServerRouter * | router() |
const QHttpServerRouter * | router() const |
void | setMissingHandler(const QObject *context, Functor &&slot) |
详细说明
QHttpServer 用于通过注册一系列请求处理程序来创建一个简单的 HTTP 服务器。
route 函数可用于方便地向服务器的QHttpServerRouter 添加规则。要注册一个在每次请求后都会调用的处理程序,以进一步处理响应,请使用addAfterRequestHandler ,但这种机制只适用于返回QHttpServerResponse 或QFuture<QHttpServerResponse>
的路由。要为所有未处理的请求注册一个处理程序,请使用setMissingHandler 。
最小示例
QHttpServerserver; server.route("/", []() {return "hello world"; });autotcpserver= newQTcpServer();if(!tcpserver->listen()|| !server.bind(tcpserver)) {deletetcpserver;return-1;} qDebug() << "Listening on port" << tcpserver->serverPort();
成员函数文档
[explicit]
QHttpServer::QHttpServer(QObject *parent = nullptr)
创建 QHttpServer 实例,其父节点为parent 。
[override virtual noexcept]
QHttpServer::~QHttpServer()
销毁QHttpServer.
template <typename Functor> void QHttpServer::addAfterRequestHandler(const QObject *context, Functor &&slot)
注册context 和slot ,以便在处理每个请求后调用。
slot 必须实现void (*)(const QHttpServerRequest &, QHttpServerResponse &)
的签名。
slot 也可以是函数指针、不可变 lambda 或其他任何带有 const 调用操作符的可复制可调用对象。在这种情况下,context 将是一个上下文对象,处理程序将一直有效,直到上下文对象被销毁。
示例
server.addAfterRequestHandler(&server, [] (const QHttpServerRequest &req, QHttpServerResponse &resp) { auto h = resp.headers(); h.append(QHttpHeaders::WellKnownHeader::Cookie, "PollyWants=Cracker"); resp.setHeaders(std::move(h)); }
注意: 只有路由处理程序处理的请求才会调用这些处理程序,这些路由处理程序要么返回QHttpServerResponse ,要么返回QFuture<QHttpServerResponse>,因此不接受QHttpServerResponder 参数。
void QHttpServer::clearMissingHandler()
将处理程序重置为默认处理程序,以产生状态为404 Not Found
的回复。
另请参阅 setMissingHandler 。
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *context, Functor &&slot)
该方法用于向服务器的QHttpServerRouter 成员添加新的Rule
。Rule
模板参数可以是从QHttpServerRouterRule 派生的任何自定义类。参数传递给Rule
。在处理传入的 HTTP 请求时,QHttpServerRouter 会使用 URL 和 HTTP 方法将Rule
与传入的 HTTP 请求匹配,并执行两者中最先匹配的一个。pathPattern 参数与传入请求的 URL 的path() 进行比较。method 参数与传入请求的 HTTP 方法进行比较。
slot 参数可以是context 的成员函数指针。也可以是函数指针、不可变 lambda 或任何其他带有 const 调用操作符的可复制可调用函数。该规则在context 的生命周期内有效。context 必须与QHttpServer 共享相同的线程亲和性,注册才能成功,规则才能执行。
槽可以用返回语句来表达其响应。在这种情况下,函数必须返回QHttpServerResponse 或任何可转换为QHttpServerResponse 的类型。转换构造函数种类繁多,请参见QHttpServerResponse 。
QHttpServer server; server.route("/test/", this, [] () { return ""; });
或者,可以提供一个可选的QHttpServerResponder& 参数,在这种情况下,必须使用该参数编写响应,函数必须返回void
。
server.route("/test2", this, [] (QHttpServerResponder &responder) { responder.write(QHttpServerResponder::StatusCode::Forbidden); });
slot 也可以将const
QHttpServerRequest & 作为最后一个参数,如果QHttpServerResponder& 是最后一个参数,则将其作为倒数第二个参数。它包含请求的详细信息。
server.route("/test3", QHttpServerRequest::Method::Post, this, [] (const QHttpServerRequest &request, QHttpServerResponder &responder) { responder.write(request.body(), "text/plain"_ba); });
slot 还可以接收任意数量的可复制参数,这些参数的类型可从QHttpServerRouter::converters() 中获取。默认情况下,这些参数包括大多数整数类型、浮点型、双倍型、QString,QByteArray, 和QUrl 。调用QHttpServerRouter::addConverter() 可以添加其他类型的转换器。
pathPattern 可以包含多个"<arg>"
子串,这些子串从左到右与slot 的参数相匹配。转换器根据这些参数的类型进行选择。
每个注册类型都有一个相关的 regex,用于匹配和转换pathPattern 中出现的"<arg>"
。这些 regex 模式被组合起来,为整个路径构建一个解析器。生成的解析器将用于验证路径是否与模式匹配。如果解析成功,则使用转换后的参数调用相应的函数。如果解析失败,则尝试下一个已注册的回调。
在下面的示例中,请求路径中替换"<arg>"
的值被转换为int
,因为 lambda 期望使用int
参数。当 HTTP 请求与路由匹配时,转换后的值将传递给 lambda 的page
参数:
QHttpServer server; server.route("/showpage/<arg>", this, [] (const int page) { return getPage(page); });
如果成功,该函数将返回一个指向新创建的 Rule 的指针,否则返回一个nullptr
。该指针可用于在任何自定义的QHttpServerRouter 类上设置参数:
auto rule = server.route<MyRule>("/test4", this, [] () {return "";}); rule->setParameter("test");
注意: 不得从slot 调用 route 这个函数,因此任何路由处理程序都不能注册其他路由处理程序。
注意: 如果请求是由接受QHttpServerResponder& 作为参数的slot 处理的,则不会调用之后的请求处理程序(参见addAfterRequestHandler )。
默认情况下,请求会在QHttpServer 的线程内按顺序处理。如果需要并发处理,请求处理程序可以返回QFuture<QHttpServerResponse>
:
server.route("/feature/<arg>", [] (int ms) { return QtConcurrent::run([ms] () { QThread::msleep(ms); return QHttpServerResponse("the future is coming"); }); });
QtConcurrent::run()的 lambda 会并发执行,但在QFuture 完成后,所有网络通信都会在QHttpServer
所属的线程中顺序执行。请注意,任何QHttpServerRequest 对象都是通过引用传递给回调的。在调用 QtConcurrent::run() 之前,提取所有需要的内容。
QHttpServerResponder& 特殊参数仅适用于返回void
的路由。使用应答器对象时,将使用该应答器对象返回响应。
另请参阅 QHttpServerRouter::addRule 和addAfterRequestHandler 。
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, Functor &&handler)
这是一个重载函数。
QHttpServer::route 的重载,为pathPattern 和QHttpServerRequest::Method::AnyKnown 创建一个规则。所有请求都会被转发到handler ,后者可以是函数指针、不可变 lambda 或其他任何带有 const 调用操作符的可复制可调用对象。该规则将一直有效,直到QHttpServer 被销毁。
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)
这是一个重载函数。
QHttpServer::route 的重载,为pathPattern 和method 创建一个规则。所有请求都会被转发到handler ,后者可以是函数指针、不可变 lambda 或其他任何带有 const 调用操作符的可复制可调用对象。该规则将一直有效,直到QHttpServer 被销毁。
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *context, Functor &&slot)
这是一个重载函数。
重载QHttpServer::route ,为pathPattern 和方法QHttpServerRequest::Method::AnyKnown 创建一个规则。所有请求均转发至context 和slot 。
QHttpServerRouter *QHttpServer::router()
返回指向路由器对象的指针。
const QHttpServerRouter *QHttpServer::router() const
返回指向常量路由器对象的指针。
template <typename Functor> void QHttpServer::setMissingHandler(const QObject *context, Functor &&slot)
为未处理的请求设置一个处理程序。
所有未处理的请求都将转发到context 的slot 。
slot 必须实现签名void (*)(const QHttpServerRequest &, QHttpServerResponder &)
。slot 也可以是函数指针、不可变 lambda 或任何其他带有 const 调用操作符的可复制可调用对象。在这种情况下,context 将是一个上下文对象。处理程序将一直有效,直到上下文对象被销毁。
默认处理程序的回复状态为404 Not Found
。
另请参见 clearMissingHandler 。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.