RESTful API 服务器

如何使用 QHttpServer 创建 RESTful API 服务器的示例。

本示例展示了如何在应用程序中使用 QHttpServer 类创建和托管简单的 RESTful 网络API。这个服务器接受 REST 风格的调用,并且可以与客户端的对应示例 RESTful 颜色调色板 API 客户端 一起使用。

遵循 REST 限制的的应用程序可非正式地描述为 RESTful。RESTful API 服务器允许创建、读取、更新和删除颜色(未知资源以与 Reqres API 兼容)和用户操作。RESTful API 服务器还提供登录/注销功能。该示例基于 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/loginapi/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);
}

除了作为 JSON 对象的新条目外,POST 方法还返回不同的 HTTP 状态码:新建条目返回 Created,预存在条目返回 AlreadyReported。此示例使用 QHttpServerResponse::QHttpServerResponse 重载发送 JSON 对象和对应的 HTTP 状态码。

要创建条目,请求体必须是一个包含 emailfirst_namelast_nameavatar 字段的 JSON 对象 - 以创建新用户。例如

{
    "email": "[email protected]",
    "first_name": "Jane",
    "last_name": "Doe",
    "avatar": "/img/faces/1-image.jpg"
}

文件

图片

© 2024 Qt公司有限法律责任公司。本文件中的文档贡献的版权属于其各自的拥有者。本文件中的文档是根据自由软件基金会发布的GNU自由文档许可协议第1.3版条款提供的。Qt及其相关标志是Qt公司有限法律责任公司在芬兰及/或其他国家的商标商标。所有其他商标均为其各自的拥有者的财产。