RESTful-API-Server

Beispiel für die Erstellung eines RESTful-API-Servers unter Verwendung der Klasse QHttpServer.

Dieses Beispiel zeigt, wie einfache RESTful-Web-APIs in einer kleinen Anwendung unter Verwendung der Klasse QHttpServer erstellt und gehostet werden können. Dieser Server akzeptiert Aufrufe im REST-Stil und kann mit seinem Gegenstück, dem RESTful Color Palette API Client, auf der Client-Seite verwendet werden.

Eine Anwendung, die sich an die REST-Bedingungen hält, kann informell als RESTful bezeichnet werden. Der RESTful API Server ermöglicht das Erstellen, Lesen, Aktualisieren und Löschen von Farben (unbekannte Ressource, die mit der Reqres API kompatibel sein muss) und Benutzern. Der RESTful API Server bietet auch Login/Logout-Funktionalität. Das Beispiel basiert auf der Reqres-API.

Um die Serveranwendung zu starten, führen Sie das Server-Binary aus:

./colorpaletteserver

oder

./colorpaletteserver --port 1234

Ein optionaler port Parameter kann angegeben werden, um den Port zu spezifizieren, auf dem der Server laufen soll.

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

Im obigen Beispiel wird die Route für die GET-Methode angegeben, die das JSON-Array mit der paginierten Liste der gespeicherten Elemente zurückgibt. Um dies zu erreichen, wird die Methode QHttpServer::route() mit der Aufzählung QHttpServerRequest::Method::Get verwendet.

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

Um ein einzelnes Element aus der Liste der Entitäten zu erhalten, wird die Element-ID in der Abfrage übergeben.

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

In diesem Beispiel akzeptiert die Route die POST-Methode, die der Artikelliste einen neuen Eintrag hinzufügt und ein JSON-Objekt zurückgibt, das den hinzugefügten Eintrag darstellt. Diese Anfrage muss autorisiert werden. Um die Anfrage zu autorisieren, muss der Wert der Kopfzeile TOKEN gleich dem zuvor von den Methoden api/login oder api/register zurückgegebenen Token sein.

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

Neben dem neuen Eintrag als JSON-Objekt geben die POST-Methoden auch verschiedene HTTP-Statuscodes zurück: Created für neue Einträge oder AlreadyReported für bereits vorhandene Einträge. In diesem Beispiel wird eine Überladung von QHttpServerResponse::QHttpServerResponse verwendet, um ein JSON-Objekt und den entsprechenden HTTP-Statuscode zu senden.

Um einen Eintrag zu erstellen, muss der Anfragekörper ein JSON-Objekt mit den Feldern email first_name last_name und avatar sein - um neue Benutzer zu erstellen. Zum Beispiel:

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

Dateien:

Bilder:

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