Servidor API RESTful

Ejemplo de cómo crear un servidor de API RESTful utilizando la clase QHttpServer.

Servidor API RESTful HTTP de Qt

Este ejemplo muestra cómo crear y alojar APIs web RESTful simples en una pequeña aplicación utilizando la clase QHttpServer. Este servidor acepta llamadas en estilo REST y se puede utilizar con su contraparte ejemplo RESTful Color Palette API cliente en el lado del cliente.

Una aplicación que obedezca las restricciones REST puede describirse informalmente como RESTful. El servidor API RESTful permite crear, leer, actualizar y eliminar operaciones de colores (recurso desconocido para ser compatible con la API Reqres) y usuarios. El servidor API RESTful también proporciona funciones de inicio y cierre de sesión. El ejemplo se basa en la API de Reqres.

Para ejecutar la aplicación del servidor, ejecute el binario del servidor:

./colorpaletteserver

o

./colorpaletteserver --port 1234

Se puede proporcionar un parámetro opcional port para especificar el puerto en el que se ejecutará el servidor.

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

En el ejemplo anterior, la ruta se especifica para el método GET, que devuelve la matriz JSON con la lista paginada de elementos almacenados. Para ello, se utiliza el método QHttpServer::route() con la enumeración QHttpServerRequest::Method::Get.

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

Para obtener un único elemento de la lista de entidades, se pasa el ID del elemento en la consulta de la petición.

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);
                 });

En este ejemplo, la ruta acepta el método POST, que añade una nueva entrada a la lista de elementos y devuelve un objeto JSON que representa la entrada añadida. Esta petición debe ser autorizada. Para autorizar la solicitud, el valor de la cabecera TOKEN debe ser igual al token devuelto previamente por los métodos api/login o 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);
}

Además de la nueva entrada como objeto JSON, los métodos POST devuelven también diferentes códigos de estado HTTP: Created para nuevas entradas, o AlreadyReported para entradas preexistentes. Este ejemplo utiliza una sobrecarga de QHttpServerResponse::QHttpServerResponse para enviar un objeto JSON y el código de estado HTTP correspondiente.

Para crear una entrada, el cuerpo de la solicitud debe ser un objeto JSON con los campos email first_name last_name y avatar - para crear nuevos usuarios. Por ejemplo

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

Archivos:

Imágenes:

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