繁體中文(香港)
  • RESTful
  • REST
  • RPC
  • API
  • architecture
  • API design

只用 POST?讓我們結束這場荒謬的 API 設計辯論

揭穿 "只用 POST" 的 API 迷思,解釋其源於對 API 設計原則的誤解,並闡明 RESTful 和 RPC 架構風格的適用案例。

Yijun
Yijun
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

最近,有關是否應該設計 "只用 POST" 的 API 的討論引起了我的注意。深入了解這場辯論後,我發現人們爭論的問題不僅沒什麼意義,還暴露了許多開發者對 API 設計本質的誤解。今天,讓我們深入探討 API 設計的核心思想,看看為什麼這場辯論根本不應該存在。

"只用 POST" 的誤解

那些主張用 "只用 POST" 來取代 RESTful API 規範的開發者顯然沒有掌握 API 設計的最重要點。他們的論點通常包括:

  1. 簡化設計:一種方法可以處理所有事情
  2. 安全性:POST 參數不會出現在 URL 中
  3. 靈活性:POST 可以發送任何數據結構

乍一看,這些論點似乎有些道理。但事實上,這種觀點混淆了 HTTP 方法的選擇和 API 設計風格,這是兩個不同層次的問題。POST 僅是 HTTP 協議的一種方法,而 REST 是一種 API 設計風格。

API 設計的本質

在討論具體 API 風格之前,我們需要了解 API 設計的核心目的。好的 API 應該是:

  1. 清晰且易於理解:其他開發者(包括你未來的自己)應該能直觀地理解每個端點的用途。
  2. 一致性:遵循某些規範以減少學習成本。
  3. 可擴展:能夠輕鬆地進行版本控制和功能擴展。
  4. 高效:考慮性能和資源利用方面的效率。

RESTful API:不僅僅是 HTTP 方法的選擇

RESTful API 只是眾多 API 設計風格之一,重點在於資源和資源上的操作。讓我們以一個簡單的博客系統為例,看看 RESTful API 是如何設計的:

  1. 獲取所有文章:

  2. 獲取特定文章:

  3. 創建新文章:

  4. 更新文章:

  5. 刪除文章:

在這個例子中,我們可以看到:

  • API 是圍繞 "文章" 資源設計的。
  • 不同的 HTTP 方法用於表示不同的操作。
  • URL 結構清晰,指示了被操作的資源。

這種設計方法使 API 更具直觀性和自描述性,讓開發者容易理解每個端點的功能。

RPC:理解 "只用 POST" 背後的 API 風格

RPC(遠程程序調用)風格 API 設計的目的是使遠程服務調用看起來像是本地函數的調用。

有趣的是,那些主張 "只用 POST" 的人可能沒有意識到他們實際上是在描述 RPC 風格。

相比於 RESTful API,RPC 更注重操作本身而非資源。因此,RPC 風格的 API 通常使用 "動詞+名詞" 的形式,例如 getProduct(productId)createUser(userData)

在許多 RPC 實現中,所有操作通常通過 POST 請求發送到同一端點,並在請求正文中指定具體的操作和參數。這就是為什麼 "只用 POST" 的想法實際上比 REST 更接近 RPC。

例如,基於 HTTP 的 RPC 風格的 "獲取產品" 請求可能如下所示:

現代 RPC 框架,例如 gRPC,提供了更強大和高效的實現。讓我們用這個例子來展示 RPC 風格:

首先,我們定義服務和消息格式(使用 Protocol Buffers):

然後,在 Node.js 客户端中使用此服務就像調用一個本地函數一樣簡單:

在這個 RPC 風格的例子中,我們可以看到:

  1. 服務定義清楚列出了所有可用的操作(在此簡化例中為 GetArticleCreateArticle)。
  2. 每個操作都有明確定義的請求和響應類型。
  3. 客户端代碼看起來像是在調用本地異步函數,使用 await 來等待結果,進一步隱藏了網絡通信的複雜性。
  4. 不需要手動構建 HTTP 請求或解析 JSON 響應。

雖然底層仍然可能使用 HTTP/2 作為傳輸協議,但 RPC 框架(如 gRPC)為開發者提供了一個抽象層,使得遠程調用看起來像本地函數調用。

因此,我們可以看到,大多數有關 "只用 POST" 和 RESTful API 的爭論本質上應該是關於這兩種 API 風格的討論:REST 和 RPC。然而,關鍵在於認識到這兩種風格各自有其適用的場景,選擇應基於項目的具體需求,而不是個人偏好。

REST vs RPC:沒有絕對的優劣之分

現在我們了解了 REST 和 RPC 之間的區別,讓我們看看它們各自的適用場景:

  1. REST 適合:
    • 資源導向的應用(如內容管理系統、博客平台、電子商務網站)
    • 需要良好緩存支持的場景(GET 請求自然可被緩存)
    • 希望利用 HTTP 語義的項目(如使用適當的狀態碼)
    • 需要良好可發現性和自描述性的面向公眾的 API
  2. RPC 適合:
    • 行動導向的應用(如複雜數據處理操作、工作流程控制)
    • 需要高性能和低延遲的系統(如實時交易系統)
    • 內部微服務之間的通信(可能需要更靈活的參數傳遞)
    • 當操作不能簡單映射到 CRUD(創建、讀取、更新、刪除)操作時

風格的選擇應基於你的具體需求。在某些情況下,你甚至可以在同一系統中混合使用這兩種風格,以滿足不同部分的需求。

結論

  1. API 設計的核心在於清晰性、一致性、可擴展性和效率,而不是堅持某種特定的方法或風格。
  2. RESTful 和 RPC 都是成熟的 API 設計範式。兩者之間的選擇應基於項目需求,而不是個人偏好。
  3. 如果你決定使用 "只用 POST",那麼請根據 RPC 風格設計你的 API。就像 RESTful 一樣,它是業界常用的 API 規範,但應在適合的情境中使用。
  4. 不要被表面的技術細節混淆。真正重要的是你的 API 能否有效地服務於用戶和業務需求。
  5. 在設計 API 時,花更多時間考慮你的資源模型、業務邏輯和用戶需求,而不是執著於使用哪種 HTTP 方法。

讓我們把注意力從這些無謂的爭論轉移開,專注於設計真正優秀的 API。畢竟,技術是用來解決問題的,而不是製造問題的。