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 は、関数ポインタ、ミュータブルでないラムダ、あるいは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、QString 、QByteArray 、QUrl である。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 のオーバーロードで、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 に転送(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.