QHttpServer Class

QHttpServer 是一个用于QAbstractHttpServerQHttpServerRouter 的简化 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 *receiver, Functor &&slot)
void clearMissingHandler()
Rule *route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *receiver, 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 *receiver, Functor &&slot)
QHttpServerRouter *router()
const QHttpServerRouter *router() const
void setMissingHandler(const QObject *receiver, Functor &&slot)

详细说明

QHttpServer 允许通过设置一系列请求处理程序来创建一个简单的 Http 服务器。

route 函数可用于向服务器QHttpServerRouter 添加规则。要注册一个在每次请求后调用的处理程序,请使用addAfterRequestHandler ;要注册一个处理所有未处理请求的处理程序,请使用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 *receiver, Functor &&slot)

注册receiverslot ,以便在处理每个请求后调用。

slot 必须实现void (*)(const QHttpServerRequest &, QHttpServerResponse &) 的签名。

slot 也可以是函数指针、不可变 lambda 或任何其他带有 const 调用操作符的可复制调用。在这种情况下,receiver 将是一个上下文对象,处理程序将一直有效,直到上下文对象被销毁。

示例

QHttpServer server;
server.addAfterRequestHandler(&server, [] (const QHttpServerRequest &req, QHttpServerResponse &resp) {
    resp.write(req.body(), "text/plain"_ba);
}

注意: 这些处理程序不会调用由QHttpServerResponder& 参数处理程序处理的请求。

void QHttpServer::clearMissingHandler()

将处理程序重置为默认处理程序,以生成状态为 404 Not Found 的回复。

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, const QObject *receiver, Functor &&slot)

这是一种方便的方法,用于在服务器的QHttpServerRouter 中添加新的Rule 。规则模板参数可以是从QHttpServerRouterRule 派生的任何自定义类。

该函数接收代表一组请求的pathPatternmethod ,并创建一个新的QHttpServerRouterRule (或自定义规则,如果在模板参数中指定),将所有相应请求转发到提供的receiverslot 。该规则被添加到router 中。有关pathPattern 中有效模式的详细信息,请参阅QHttpServerRouterRule 文档。

slot 可以是 的成员函数指针。也可以是函数指针、不可变 lambda 或任何其他带有 const 调用操作符的可复制可调用函数。在这种情况下, 必须是 指针。该规则在 的生命周期内有效。接收者必须与 共享相同的线程亲缘关系,注册才能成功,规则才能执行。receiver receiver QObject receiver QHttpServer

槽可以用返回语句表达其响应。函数必须返回QHttpServerResponse 或任何可转换为QHttpServerResponse 的类型。转换构造函数种类繁多,请参见QHttpServerResponse

QHttpServer server;
server.route("/test", this, [] () { return ""; });

或者,也可以提供一个可选的最后一个函数参数QHttpServerResponder& ,将响应写入该参数。如果响应被写入QHttpServerResponder& ,函数必须返回void

server.route("/test2", this, [] (QHttpServerResponder &responder) {
                                responder.write(QHttpServerResponder::StatusCode::Forbidden); });

该槽还可以将const QHttpServerRequest& 作为倒数第二个参数,以获取请求的详细信息。

server.route("/test3", this, [] (const QHttpServerRequest &request,
                                QHttpServerResponder &responder) {
                                responder.write(request.body(), "text/plain"_ba);});

最后,回调可以包含任意数量的可复制参数,这些参数已在QHttpServerRouter::converters 注册。默认情况下,这些参数包括大多数整数类型、浮点型、双倍型、QStringQByteArrayQUrl 。还可以注册其他转换器,请参见QHttpServerRouter::addConverter 。这些参数必须在pathPattern 中有相应的占位符。有关占位符和 pathPattern 的详细信息,请参见QHttpServerRouterRule

QHttpServer server;
server.route("/test/<arg>", this, [] (const int page) { return ""; });

如果成功创建,该函数将返回指向新创建规则的指针,否则返回nullptr 。该指针可用于在任何自定义的QHttpServerRouter 类上设置参数:

auto rule = server.route<MyRule>("/test", this, [] () {return "";});
rule->setParameter("test");

.此函数不得从任何路由回调中调用。

注意: 如果请求是由接受QHttpServerResponder& 作为参数的处理程序处理的,则不会调用之后的请求处理程序(参见addAfterRequestHandler )。

默认情况下,请求会在QHttpServer 的线程内按顺序处理。如果需要异步处理,请求处理程序可以返回QFuture<QHttpServerResponse>

server.route("/feature/", [] (int id) {
    return QtConcurrent::run([] () {
        return QHttpServerResponse("the future is coming");
    });
});

QFuture 的主体是异步执行的,但所有网络通信都是在QHttpServer 所属的线程中顺序执行的。QHttpServerResponder& 特殊参数不适用于返回QFuture 的路由。

另请参阅 QHttpServerRouter::addRuleaddAfterRequestHandler

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, Functor &&handler)

这是一个重载函数。

重载QHttpServer::route ,为pathPatternQHttpServerRequest::Method::AnyKnown 创建一个规则。所有请求都会被转发到handler ,它可以是一个函数指针、一个不可变的 lambda 或其他任何带有 const call 操作符的可复制调用。该规则将一直有效,直到QHttpServer 被销毁。

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)

这是一个重载函数。

重载QHttpServer::route ,为pathPatternmethod 创建一个规则。所有请求都会被转发到handler ,它可以是一个函数指针、一个不可变的 lambda 或其他任何带有 const call 操作符的可复制调用。该规则将一直有效,直到QHttpServer 被销毁。

template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *receiver, Functor &&slot)

这是一个重载函数。

重载QHttpServer::route ,为pathPatternQHttpServerRequest::Method::AnyKnown 创建一个规则。所有请求均转发至receiverslot

QHttpServerRouter *QHttpServer::router()

返回指向路由器对象的指针。

const QHttpServerRouter *QHttpServer::router() const

返回指向常量路由器对象的指针。

template <typename Functor> void QHttpServer::setMissingHandler(const QObject *receiver, Functor &&slot)

为未处理的请求设置一个处理程序。

所有未处理的请求都将转发到receiverslot

slot 必须实现签名void (*)(const QHttpServerRequest &, QHttpServerResponder &)slot 也可以是函数指针、不可变 lambda 或任何其他带有 const 调用操作符的可复制调用对象。在这种情况下,receiver 将是一个上下文对象。处理程序将一直有效,直到接收者对象被销毁。

默认处理程序的回复状态为 404:未找到。

© 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.