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)

各リクエストが処理された後に呼び出されるcontextslot を登録する。

slot はシグネチャvoid (*)(const QHttpServerRequest &, QHttpServerResponse &) を実装しなければならない。

slot は、関数ポインタ、ミュータブルでないラムダ、あるいはconst call演算子を持つ他のコピー可能な呼び出し可能なものであることもできる。その場合、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 のメンバ関数ポインタであることができる。 また、関数ポインタ、変更不可能なラムダ、または const call 演算子を持つ他のコピー可能な callable であることもできる。context登録が成功し、ルールが実行されるためには、context は、QHttpServer と同じスレッド親和性を共有しなければならない。

スロットはreturnステートメントで応答を表現することができる。その場合、関数は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& が最後のパラメータの場合は最後から2番目のパラメータとなる。これはリクエストの詳細情報を含む。

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

slot は、QHttpServerRouter::converters()から利用可能な型を持つコピー可能なパラメータを いくらでも取ることもできる。デフォルトでは、これらはほとんどの整数型、float、double、QStringQByteArrayQUrl である。QHttpServerRouter::addConverter() を呼び出すことで、追加型のコンバータを追加できる。

pathPattern には、slot のパラメータと左から右にマッチする"<arg>" の部分文字列をいくつか含めることができる。コンバーターは、これらのパラメーターの型に基づいて選択される。

登録された各タイプは、pathPattern 内で"<arg>" の出現をマッチさせ、変換するために使用される関連正規表現を持っている。 これらの正規表現パターンは、パス全体のパーサーを構築するために組み合わされる。そして、結果として得られるパーサーは、パスがパターンにマッチするかどうかを検証するために使用される。解析が成功した場合、対応する関数が変換されたパラメータで呼び出される。解析に失敗した場合は、次に登録されたコールバックが呼び出されます。

以下の例では、"<arg>" を置き換えるリクエストパスの値は、ラムダがint パラメータを想定しているため、int に変換されます。HTTPリクエストがルートにマッチすると、変換された値がラムダの引数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");

注: この関数routeは、slot から呼んではならないので、 ルートハンドラは他のルートハンドラを登録できない。

: リクエストが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()のラムダは並行して実行されますが、すべてのネットワーク通信は、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 のオーバーロードで、pathPatternQHttpServerRequest::Method::AnyKnown のルールを作成します。すべてのリクエストは、handler に転送されます。 は、関数ポインタ、ミュータブルでないラムダ、または const call 演算子を持つコピー可能な呼び出し可能なその他のものであることができます。このルールはQHttpServer が破棄されるまで有効です。

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

これはオーバーロードされた関数である。

QHttpServer::route のオーバーロードで、pathPatternmethod のルールを作成します。すべてのリクエストは、handler に転送されます。 は、関数ポインタ、ミュータブルでないラムダ、または const call 演算子を持つコピー可能な呼び出し可能なその他のものであることができます。このルールはQHttpServer が破棄されるまで有効です。

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

これはオーバーロードされた関数である。

QHttpServer::route のオーバーロードで、pathPattern とメソッドQHttpServerRequest::Method::AnyKnown のルールを作成します。すべてのリクエストはcontextslot に転送されます。

QHttpServerRouter *QHttpServer::router()

ルーターオブジェクトへのポインターを返します。

const QHttpServerRouter *QHttpServer::router() const

定数ルーターオブジェクトへのポインターを返します。

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

処理されなかったリクエストのハンドラを設定する。

すべての処理されなかったリクエストはcontextslot に転送(forward)される。

slot は署名void (*)(const QHttpServerRequest &, QHttpServerResponder &) を実装しなければならない。slot は、関数ポインタ、ミュータブルでないラムダ、あるいはconst call演算子を持つ他のコピー可能な呼び出し可能なものであることもできる。その場合、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.