本例使用QHttpServer創建RESTful API服務端。
此例接收REST風格的請求,與此例與之對應的客戶端是RESTful Color Palette API client。
滿足REST限制的API被稱為RESTful風格的API。
RESTful API服務端一般包括:create、read、update、delete操作。
其中部分操作需要RESTful服務端提供login/logout功能。
執行服務端的二進制程序的命令:
./colorpaletteserver
或
./colorpaletteserver --port 1234
上面命令中port參數提供了指定服務端開放的tcp端口的功能。
httpServer.route(QString("%1").arg(apiPath), QHttpServerRequest::Method::Get,[&api](const QHttpServerRequest &request) { return api.getPaginatedList(request); });
上例中,route指定GET方法,以JSON數組的形式返回當前提供的頁碼的數據。其中QHttpServer::route()中使用QHttpServerRequest::Method::Get枚舉類型,指明這個route為GET方法。
httpServer.route(QString("%1/<arg>").arg(apiPath), QHttpServerRequest::Method::Get,[&api](qint64 itemId) { return api.getItem(itemId); });
上面的代碼通過請求中的ID參數,獲取list實例中單獨的那條。
httpServer.route(QString("%1/<arg>").arg(apiPath), QHttpServerRequest::Method::Get,[&api](qint64 itemId) { return api.getItem(itemId); });
上例中,route接收POST方法,新增一個實例,并且返回新增的實例。此請求必須被認證,認證的token需要放到請求的head中,其中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);}
上面的postItem函數中返回了不同HTTP狀態。上例中利用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"}