---

### 長時間運行操作的挑戰

假設我們正在開發一款SaaS服務,該服務利用機器學習分析博客文章的情感傾向。用戶提交文章鏈接后,系統會分析情感并返回結果。由于分析過程可能需要數秒甚至一分鐘完成,如何在[用戶體驗](http://m.dlbhg.com/blog/tech-enthusiasts-must-read-how-to-completely-transform-user-experience-with-ai-qa-api)和技術實現之間找到平衡成為關鍵。

#### 用戶體驗的期望

用戶通常希望在點擊按鈕后,能在5秒內看到某種進度反饋。如果操作超過5秒,簡單的加載指示器可能無法滿足用戶需求,甚至會導致用戶取消請求或關閉頁面。因此,設計支持進度監控和取消功能的異步API尤為重要。

---

### REST API的異步設計

REST API在處理長時間運行操作時,通常采用異步設計。其核心思想是通過返回任務的唯一標識符,允許客戶端輪詢任務狀態,而不是讓客戶端同步等待。

#### 異步API的實現

1. **任務提交**:客戶端提交任務后,服務器返回一個唯一標識符(ID)。
2. **狀態查詢**:客戶端使用該ID輪詢任務狀態,直到任務完成。
3. **取消任務**:服務器提供專用的取消URL,允許客戶端取消任務。

以下是一個典型的REST異步API響應示例:

```json

{
"status": "202 Accepted",
"links": {
"status": "/tasks/{id}/status",
"cancel": "/tasks/{id}/cancel"
}
}```

通過這種設計,REST API可以利用超媒體控制(HATEOAS),為每個任務提供明確的操作鏈接,使得API的使用更加直觀。

---

### GraphQL的異步設計

與REST類似,GraphQL也可以通過輪詢機制實現異步操作。然而,GraphQL的優勢在于其內置的[訂閱功能](http://m.dlbhg.com/blog/yq-how-to-implement-api-subscription),為異步任務提供了更優雅的解決方案。

#### GraphQL Schema設計

以下是一個支持異步任務的GraphQL Schema示例:

```graphql

type Mutation {
createTask(input: TaskInput!): Task
}type Subscription {
taskStatusChanged(id: ID!): TaskStatus
}interface Task {
id: ID!
status: String!
}type SuccessfulTask implements Task {
id: ID!
status: String!
result: String
}```

1. **任務創建**:通過createTask變更操作提交任務,返回任務ID。 2. **狀態訂閱**:客戶端使用taskStatusChanged訂閱任務狀態的變化。 3. **優化設計**:通過接口(Interface)明確任務類型,使API更具可讀性和[類型安全](http://m.dlbhg.com/blog/la-nexus-1-0-a-major-release-for-type-safe-code-first-graphql-apis)性。 #### 訂閱的優勢與挑戰 相比輪詢,訂閱提供了更直觀的事件流模型。然而,訂閱通常依賴WebSocket連接,這可能帶來以下挑戰: - **后端復雜性**:需要支持WebSocket的托管環境。 - **擴展性問題**:WebSocket連接的擴展性與短連接不同。 - **兼容性問題**:WebSocket是HTTP/1.1特性,與HTTP/2不兼容。 盡管如此,GraphQL的訂閱功能在某些場景下仍然是更優雅的選擇。 --- ### REST與GraphQL的對比分析 #### REST的優勢 - **超媒體控制**:每個資源都有唯一URL,操作鏈接明確。 - **簡單易用**:無需強制定義Schema,適合快速開發。 #### GraphQL的優勢 - **類型安全**:強制Schema定義,API更加明確。 - **靈活性**:通過訂閱功能實現更優雅的異步操作。 #### 共同點 無論選擇REST還是GraphQL,對于長時間運行的操作,異步設計始終優于同步設計。兩者都可以通過適當的設計滿足異步任務的需求。 --- ### 設計優秀API的關鍵 在選擇REST或GraphQL時,以下幾點尤為重要: 1. **用戶需求**:了解用戶更熟悉哪種API風格,以及他們是否需要訂閱功能。 2. **技術權衡**:根據項目需求選擇合適的技術方案,例如輪詢或訂閱。 3. **良好的[API治理](http://m.dlbhg.com/wiki/api-governance/)**:通過工具和規范(如Siren)提升API的可用性和可維護性。 值得注意的是,REST和GraphQL并非對立關系。優秀的REST API可以輕松包裝為GraphQL,反之亦然。根據用戶需求提供多種風格的API,是提升用戶體驗的重要策略。 --- ### 總結 REST和GraphQL在設計長時間運行操作的API時各有優劣。REST以其超媒體控制和簡單性著稱,而GraphQL則憑借類型安全和訂閱功能脫穎而出。最終,優秀的API設計不僅在于選擇技術,更在于理解用戶需求和權衡技術復雜性。 無論選擇哪種技術,投入精力做好API設計、與用戶保持良好溝通,才是成功的關鍵。 干杯!

原文鏈接: https://wundergraph.com/blog/api_design_best_practices_for_long_running_operations_graphql_vs_rest

上一篇:

API設計優先與代碼優先的比較 - 讓你滿意的API

下一篇:

人臉識別權威評測:技術進展與應用現狀
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費