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)
このメソッドは、新しいルーティングRule
をサーバーのQHttpServerRouter メンバーに追加する。Rule
テンプレートパラメータはQHttpServerRouterRule から派生した任意のクラスにすることができます。 パラメータはRule
に渡されます。 サーバは URL パスと HTTP メソッドに基づいて、登録されたルールと着信 HTTP リクエストをマッチさせ、 両者の最初のマッチが実行されます。
pathPattern パラメータは、送られてくるリクエストのURLのpath() と比較される。method パラメータは、受信リクエストのHTTPメソッドと比較される。slot パラメータはリクエストハンドラである。これは、context のメンバ関数ポインタ、関数ポインタ、ミュータブルでないラムダ、 またはconst呼び出し演算子を持つコピー可能な呼び出し可能である。context 、コンテキストが存在する限り、ルールは有効である。context は、QHttpServer と同じスレッド親和性を共有しなければならない。
slot は、"<arg>"
プレースホルダにマッチすることでpathPattern から抽出される、任意の数の解析済み引数を引数として取り、その後にオプションのQHttpServerRequest とオプションのQHttpServerResponder が続く。これら2つのクラスはスペシャルと呼ばれる。
slot は、QHttpServerResponse または変換可能な型を返すことができる:
QHttpServer server; server.route("/test/", this, [] () { return ""; });
あるいは、オプションのQHttpServerResponder& 引数が提供された場合、レスポンスはそれを使用して記述されなければならず、関数はvoid
を返さなければならない。
server.route("/test2", this, [] (QHttpServerResponder &responder) { responder.write(QHttpServerResponder::StatusCode::Forbidden); });
QHttpServerRequest オブジェクトはリクエストのボディにアクセスするために使用できる:
server.route("/test3", QHttpServerRequest::Method::Post, this, [] (const 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");
注意: この関数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)
pathPattern とQHttpServerRequest::Method::AnyKnown のルールを作成するためのQHttpServer::route のオーバーロード。すべてのリクエストは、handler に転送される。 は、関数ポインタ、ミュータブルでないラムダ、const call 演算子を持つコピー可能なその他の呼び出し可能なものである。このルールは、QHttpServer が破棄されるまで有効である。
これはオーバーロードされた関数である。
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, QHttpServerRequest::Methods method, Functor &&handler)
pathPattern とmethod のルールを作成するためのQHttpServer::route のオーバーロード。すべてのリクエストは、handler に転送される。 は、関数ポインタ、ミュータブルでないラムダ、const call 演算子を持つコピー可能なその他の呼び出し可能なものである。このルールは、QHttpServer が破棄されるまで有効である。
これはオーバーロードされた関数である。
template <typename Rule = QHttpServerRouterRule, typename Functor> Rule *QHttpServer::route(const QString &pathPattern, const QObject *context, Functor &&slot)
pathPattern とメソッドQHttpServerRequest::Method::AnyKnown のルールを作成するためのQHttpServer::route のオーバーロード。すべてのリクエストは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.