
RESTful Web API 設計中要避免的 6 個常見錯誤
在本文中,我們使用 macOS 作為開發環境,并通過 Homebrew 安裝了大部分依賴項。以下是安裝的基本步驟:
$ brew update
安裝完成后,你應該能夠在以下目錄中找到 Boost 庫(版本可能因時間而異):
/usr/local/Cellar/boost/1.60.0_1
我們將使用 C++ REST SDK 來創建一個多線程服務器,該服務器提供 REST API 接口。這種架構非常適合構建高性能、任務關鍵型的微服務后端。
該服務的基本架構如下所示:
在架構中,控制器為每種 HTTP 方法提供處理程序,包括以下方法:
-GET
–POST
-PUT
-DELETE
-HEAD
-TRACE
-CONNECT
–MERGE
-PATCH
控制器的核心是 web::http::experimental::listener::http_listener
類,它使服務能夠監聽 HTTP 請求。一旦收到請求,http_listener
會驗證請求的有效性,并檢查是否支持相應的 HTTP 方法。如果支持,則將請求傳遞給控制器進行進一步處理。控制器會在獨立的線程中執行請求邏輯,從而確保 http_listener
能夠快速響應新的請求。
為了注冊處理程序,我們使用了一個名為 MicroserviceController
的類。該類繼承自 BasicController
和 Controller
,其中:
BasicController
提供了對 http_listener
的封裝,以及一些便捷方法(如解析端點字符串、獲取主機 IP 地址等)。Controller
定義了接口,MicroserviceController
實現了這些接口的具體邏輯。以下是 MicroserviceController
的部分代碼示例:
#pragma once
using namespace cfx;
#include ;
class MicroserviceController : public BasicController, public Controller {
// 實現代碼
};
在實現中,MicroserviceController
覆蓋了 BasicController::initRestOpHandlers()
方法,并為每種 HTTP 方法提供具體的處理邏輯。例如,以下代碼展示了 GET 方法的處理程序:
void MicroserviceController::handleGet(http_request message) {
// 處理 GET 請求的邏輯
}
通過類方法 _requestPath
,可以解析請求路徑并提取 REST API 的輸入參數。如果請求成功,服務會返回 JSON 格式的響應;如果路徑不匹配,則返回 HTTP 404 錯誤。
服務的初始化邏輯位于 main.cpp
文件中,以下是主要步驟:
掛接 SIGINT 中斷信號,用于處理用戶在終端輸入的 Ctrl+C 操作:
InterruptHandler::hookSIGINT();
創建并初始化服務,同時監聽指定端點的請求。端點可以是自動檢測的主機 IP 地址(IPv4 或 IPv6),也可以是固定的域名或 IP 地址。例如:
server.accept().wait();
在調試模式下,服務進程會生成大約 40 個線程,這些線程由 PPLX 調度程序管理,用于高效處理并發請求。
設置阻塞調用,等待用戶中斷:
InterruptHandler::waitForUserInterrupt();
當用戶終止進程時,關閉服務并等待所有線程完成:
server.shutdown().wait();
通過本文的介紹,我們可以看到,使用現代 C++ 實現微服務的過程并不復雜,其代碼結構與 Node.js 實現 REST 接口的方式非常相似。在后續文章中,我將進一步探討如何從 JSON 請求中提取數據,以及如何為服務添加 SSL 支持。
原文鏈接: https://medium.com/@ivan.mejia/modern-c-micro-service-implementation-rest-api-b499ffeaf898