QHttpServer Class

QHttpServer は、QAbstractHttpServer およびQHttpServerRouter 用の簡易 API です。詳細...

Header: #include <QHttpServer>
CMake: find_package(Qt6 REQUIRED COMPONENTS HttpServer)
target_link_libraries(mytarget PRIVATE Qt6::HttpServer)
qmake: QT += httpserver
Since: Qt 6.4
Inherits: QAbstractHttpServer
Status: Technical Preview

パブリック関数

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

最小限の例

QHttpServer server;

server.route("/", [] () {
    return "hello world";
});

auto tcpserver = new QTcpServer();
if (!tcpserver->listen() || !server.bind(tcpserver.get())) {
    delete tcpserver;
    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 (*)(QHttpServerResponse&, const QHttpServerRequest&) を実装する必要があります。

slot は、関数ポインタ、ミュータブルでないラムダ、あるいは const call 演算子を持つ他のコピー可能な callable にすることもできます。その場合、receiver はコンテキストオブジェクトとなり、ハンドラはコンテキストオブジェ クトが破棄されるまで有効である。

QHttpServer server;
server.addAfterRequestHandler(&server, [] (QHttpServerResponse &resp, const QHttpServerRequest &req) {
    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)

これは新しいRule をサーバのQHttpServerRouter に追加するための便利なメソッドです。Rule テンプレート・パラメータには、QHttpServerRouterRule から派生した任意のカスタム・クラスを指定できます。

この関数はリクエストのセットを表すpathPatternmethod を受け取り、すべてのリクエストを指定されたreceiverslot に転送する新しいQHttpServerRouterRule (またはテンプレートパラメータで指定された場合はカスタムルール) を作成します。ルールはrouter に追加される。pathPattern の有効なパターンの詳細については、QHttpServerRouterRule のドキュメントを参照のこと。

slot は、 のメンバ関数ポインタであることができます。 また、関数ポインタ、ミュータブルでないラムダ、または const call 演算子を持つ他のコピー可能な呼び出し可能な関数であることもできます。その場合、 は ポインタでなければなりません。登録が成功し、ルールが実行されるためには、受信者は、 と同じスレッド親和性を共有しなければならない。receiver receiver QObject receiver QHttpServer

スロットはreturnステートメントで応答を表現することができる。関数はQHttpServerResponse またはQHttpServerResponse に変換可能な任意の型を返さなければならない。QHttpServerResponse を参照してください。

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

あるいは、オプションで最後の関数引数QHttpServerResponder& を指定し、その引数にレスポンスを書き込むこともできます。レスポンスがQHttpServerResponder& に書き込まれる場合、関数はvoid を返さなければなりません。

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

スロットはさらに、リクエストの詳細な情報を得るために、最後から2番目のパラメー タとしてconst QHttpServerRequest& を持つことができます。

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

最後に、コールバックは、QHttpServerRouter::converters に登録されている、任意の量のコピー可能なパラメータを含むことができる。 デフォルトでは、これらはほとんどの整数型、float、double、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 が属するスレッドで逐次的に実行される。QFuture を返すルートでは、QHttpServerResponder& の特別引数は使用できません。

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 演算子を持つその他のコピー可能な callable であることができる。このルールは、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 に転送(forward)される。

slot はシグネチャvoid (*)(const QHttpServerRequest &, QHttpServerResponder &) を実装しなければならない。slot は、関数ポインタ、ミュータブルでないラムダ、あるいはconst call演算子を持つ他のコピー可能な呼び出し可能なものであることもできます。その場合、receiver はコンテキストオブジェクトとなる。ハンドラは、レシーバーオブジェクトが破棄されるまで有効である。

デフォルトのハンドラは、ステータス404:Not Found と返信されます。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。