このページでは

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 を使用します。

最小限の例:

QHttpServer server;

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)

親としてparent を持つQHttpServerのインスタンスを作成します。

[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 は、関数ポインタ、非可変ラムダ、または 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> を返すルートハンドラによって処理されるリクエストに対してのみ呼び出されます。

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リクエストを、URLパスとHTTPメソッドに基づいて登録済みのルールと照合し、両方が一致する最初のルールを実行します。

pathPattern パラメータは、着信リクエストのURLのpath()と比較されます。method パラメータは、着信リクエストのHTTPメソッドと比較されます。slot パラメータはリクエストハンドラです。これは、context のメンバ関数ポインタ、関数ポインタ、不変のラムダ式、またはconst call演算子を持つコピー可能な呼び出し可能オブジェクトのいずれかです。context が指定された場合、コンテキストが存在する限り、ルールは有効なままとなります。context は、QHttpServer と同じスレッドアフィニティを共有する必要があります。

slot は、引数として、任意の数の解析済み引数を受け取ります。これらは、pathPattern から"<arg>" プレースホルダーに一致させることで抽出され、その後にオプションのQHttpServerRequest およびオプションのQHttpServerResponder が続きます。これら2つのクラスはスペシャルと呼ばれます。

slot は、QHttpServerResponse または変換可能な型を返すことができます:

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

注:この 関数 route()は 、slot から呼び出してはならない。したがって、ルートハンドラが他のルートハンドラを登録することはできない。

あるいは、オプションのQHttpServerResponder 引数が指定された場合、レスポンスはその引数を使用して記述されなければならず、関数はvoid またはQFuture<void>を返さなければなりません。QFuture<VOID> のサポートは Qt 6.11 で追加されました。QHttpServerResponder はコピー不可能であり、参照または右辺値参照として渡すことができます。ただし、QFuture<VOID> を返す場合は、スコープ外に出ないようにするため、右辺値参照として渡す必要があります。

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

注: QHttpServerResponder を引数として受け取るslot によってリクエストが処理された場合 、リクエスト後のハンドラ(addAfterRequestHandler を参照)はいずれも呼び出されません。

さらに、QHttpServerRequest は最後の引数として、あるいはQHttpServerResponder 引数がある場合は最後から2番目の引数として使用でき、リクエストの詳細情報を取得できます。これはconst参照(非並行コールバックのみ)または値渡しで渡すことができ、リクエストの本文にアクセスするために使用できます:

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

pathPattern 内のプレースホルダー("<arg>" )は、ハンドラの引数型に合わせて自動的に変換されます。サポートされる型には、整数、浮動小数点数、QString 、QByteArray 、およびQUrl が含まれます。QUrl クラスを最後のパラメータとして使用することで、pathPattern の終了を処理でき、これを分割することで任意の数の引数をサポートできます。QHttpServerRouter::addConverter() を使用して、カスタムコンバータを追加できます。

登録された各型には、pathPattern 内のプレースホルダーを照合・変換するために使用される正規表現が関連付けられています。これらの正規表現パターンを組み合わせて、パス全体のパーサーを構築します。 生成されたパーサーは、パスがパターンに一致するかどうかを検証するために使用されます。解析に成功した場合、変換されたパラメータを引数として、対応する関数が呼び出されます。解析に失敗した場合は、次に登録されているコールバックが試行されます。すべてのコールバックで解析に失敗した場合は、missingHandlerが呼び出されます。

以下の例では、リクエストパス内の `"<arg>" ` に代わる値が `int ` に変換されます。これは、ラムダ関数が `int ` パラメータを期待しているためです。HTTPリクエストがルートに一致すると、変換された値がラムダ関数の `page ` 引数に渡されます:

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

この関数は、成功した場合は新しく作成されたRuleへのポインタを返し、失敗した場合はnullptr を返します。このポインタを使用して、任意のカスタムQHttpServerRouter クラスのパラメータを設定できます:

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

デフォルトでは、リクエストはQHttpServer のスレッド内で順次処理されます。並行処理が必要な場合は、リクエストハンドラがQFuture<QHttpServerResponse> を返すようにします:

server.route("/feature/<arg>", [] (int ms) {
    return QtConcurrent::run(pool, [ms] () {
        QThread::msleep(ms);
        return QHttpServerResponse("the future is coming");
    });
});

QtConcurrent::run() のラムダ式は並行して実行されますが、すべてのネットワーク通信はQHttpServer が属するスレッド内で実行されます。

フューチャーを返すルートは、HTTP/2 接続上でのみ完全に並行して実行されます。以前のバージョンの HTTP では、異なるレスポンスの一部を交互に処理することはサポートされていません。レスポンスは、リクエストが到着したのと同じ順序で完全に返される必要があります。 したがって、たとえルートハンドラーが `QFuture<void>` を返したとしても、その HTTP/1 接続に対する次のリクエストは、現在のリクエストの処理が完了するまで処理されません。ただし、異なる接続上のルートハンドラーは並行して実行可能です。

ルートハンドラを並行実行させることは、すべてのバージョンのHTTPにおいて利点があります。これは、QHttpServer が属するスレッドが、並行実行によって行われる処理の負担から解放されるためです。

QHttpServerRequest はコピー可能であり、フューチャーを返す際には値としてキャプチャする必要があります。これは、slot に渡された変数が、フューチャーが終了する前にスコープ外になる可能性があるためです。

server.route("/test4", QHttpServerRequest::Method::Post, this,
             [] (QHttpServerRequest request) {
                return QtConcurrent::run(pool, [request]() {
                    return QHttpServerResponse("text/plain"_ba, request.body());
                }
             });

フューチャーを返す際に、QHttpServerRequest またはQHttpServerResponder を参照でキャプチャするslot は、それが禁止されている理由を説明するアサーションを引き起こします。

すべてのプラットフォームが、QHttpServerResponder をQConcurrent::runに渡される可変ラムダ式に移動することをサポートしているわけではないため、回避策として、QHttpServerResponder をstd::shared_ptrに移動し、それをコピーするようにします。

server.route("/concurrent-multipart-back/<arg>",
             [](QString message, QHttpServerResponder &&responder) {
                return QtConcurrent::run(pool,
                    [=, r = std::make_shared<QHttpServerResponder>(std::move(responder))] {
                        QByteArray ba = message.toUtf8();
                        r->writeBeginChunked("text/plain"_ba);
                        for (ushort i = 1; i < 8; ++i) {
                            r->writeChunk(ba);
                        }
                        r->writeEndChunked(ba);
                    });
            });

QHttpServerRouter::addRule およびaddAfterRequestHandlerも参照してください 。

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

`QHttpServer::route ` をオーバーロードして、`pathPattern ` および `QHttpServerRequest::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 のオーバーロードにより、pathPattern およびmethod に対するルールを作成します。すべてのリクエストは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 というメソッドに対するルールを作成します。すべてのリクエストは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 は、関数ポインタ、非可変ラムダ、またはconst call演算子を持つその他のコピー可能な呼び出し可能オブジェクトでも構いません。その場合、context はコンテキストオブジェクトとなります。ハンドラは、コンテキストオブジェクトが破棄されるまで有効です。

デフォルトのハンドラは、ステータス404 Not Found で応答します。

「clearMissingHandler」も参照してください 。

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