RESTful API サーバー

QHttpServer を使用した RESTful API サーバーの作成例。

Qt HTTP RESTful API サーバー

この例では、QHttpServer クラスを使用して、小規模なアプリケーション内でシンプルな RESTful Web API を作成・ホストする方法を示します。このサーバーは REST 形式の呼び出しを受け付け、クライアント側では対応する「RESTful カラーパレット API クライアント」の例と組み合わせて使用できます。

RESTの制約に従うアプリケーションは、一般に「RESTful」と表現されます。このRESTful APIサーバーでは、色(Reqres APIとの互換性を確保するため、リソース名は「unknown」としています)およびユーザーに対する作成、読み取り、更新、削除の操作が可能です。また、ログイン/ログアウト機能も提供しています。この例はReqres APIに基づいています。

サーバーアプリケーションを実行するには、サーバーバイナリを実行します:

./colorpaletteserver

または

./colorpaletteserver --port 1234

オプションのport パラメータを指定することで、サーバーが動作するポートを指定できます。

httpServer.route(
        QString("%1").arg(apiPath), QHttpServerRequest::Method::Get,
        [&api](const QHttpServerRequest &request) { return api.getPaginatedList(request); });

上記の例では、GETメソッド用のルートが指定されており、保存されている項目のページ分けされたリストを含むJSON配列が返されます。これを実現するために、`QHttpServer::route()`メソッドが`QHttpServerRequest::Method::Get `列挙型とともに使用されています。

httpServer.route(QString("%1/<arg>").arg(apiPath), QHttpServerRequest::Method::Get,
                 [&api](qint64 itemId) { return api.getItem(itemId); });

エンティティのリストから単一のアイテムを取得するには、リクエストのクエリにアイテム ID を指定します。

httpServer.route(QString("%1").arg(apiPath), QHttpServerRequest::Method::Post,
                 [&api, &sessionApi](const QHttpServerRequest &request) {
                     if (!sessionApi.authorize(request)) {
                         return QHttpServerResponse(
                                 QHttpServerResponder::StatusCode::Unauthorized);
                     }
                     return api.postItem(request);
                 });

この例では、ルートはPOSTメソッドを受け付け、アイテムリストに新しいエントリを追加し、追加されたエントリを表すJSONオブジェクトを返します。このリクエストには認証が必要です。リクエストを認証するには、ヘッダーのTOKEN の値が、api/login またはapi/register メソッドから以前に返されたトークンと一致している必要があります。

QHttpServerResponse postItem(const QHttpServerRequest &request)
{
    const std::optional<QJsonObject> json = byteArrayToJsonObject(request.body());
    if (!json)
        return QHttpServerResponse(QHttpServerResponder::StatusCode::BadRequest);

    const std::optional<T> item = factory->fromJson(*json);
    if (!item)
        return QHttpServerResponse(QHttpServerResponder::StatusCode::BadRequest);
    if (data.contains(item->id))
        return QHttpServerResponse(QHttpServerResponder::StatusCode::AlreadyReported);

    const auto entry = data.insert(item->id, *item);
    return QHttpServerResponse(entry->toJson(), QHttpServerResponder::StatusCode::Created);
}

POSTメソッドは、JSONオブジェクトとしての新しいエントリに加え、異なるHTTPステータスコードも返します。新しいエントリの場合はCreated 、既存のエントリの場合はAlreadyReported です。この例では、QHttpServerResponse::QHttpServerResponse のオーバーロードを使用して、JSONオブジェクトと対応するHTTPステータスコードを送信しています。

エントリを作成するには、リクエスト本文が、email 、first_name 、last_name 、およびavatar フィールドを含むJSONオブジェクトでなければなりません(新規ユーザーを作成する場合)。例:

{
    "email": "jane.doe@qt.io",
    "first_name": "Jane",
    "last_name": "Doe",
    "avatar": "/img/faces/1-image.jpg"
}

ファイル:

画像:

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