目錄
JSON-RPC 2.0 簡介
請求對象
響應對象
通知
批量請求
錯誤碼
使用場景
文檔和版本控制
社區和支持
小結
參考資料
JSON-RPC 2.0 簡介
JSON-RPC (JavaScript Object Notation - Remote Procedure Call) 是一種輕量級的遠程過程調用協議,使用 JSON(JavaScript 對象表示法)作為數據格式。JSON-RPC 2.0 是該協議的最新版本,在 1.0 版本的基礎上增加了一些特性,如錯誤代碼標準化、批量請求支持和無響應的通知。
JSON-RPC 的設計原則是簡單性和互操作性,旨在為不同編程語言之間提供一種方便的方法來執行遠程過程調用。通過定義一組簡單的規則,任何能夠解析 JSON 的語言或平臺都可以實現 JSON-RPC 客戶端或服務器。
接下來看下 JSON-RPC 2.0 協議的規范。
請求對象
一個 JSON-RPC 2.0 請求數據是一個單一的 JSON 對象,可以包含以下成員:
- jsonrpc:字符串,指定 JSON-RPC 的版本號,對于 2.0 規范來說,這個值必須是 2.0。
- method:字符串,指定要調用的遠程方法的名稱。
- params:結構化值,可以是數組或者對象,傳遞給遠程方法的參數。如果方法不需要參數可以省略。
- id:唯一標識符,可以是字符串或數字,用于關聯請求和響應,服務端必須返回相同的值。如果請求是一個通知類型,則此參數可以被省略。
一個標準的 JSON-RPC 2.0 請求示例如下:
{"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": 1
}
響應對象
一個 JSON-RPC 2.0 響應數據也是一個單一的 JSON 對象,可以包含以下成員:
- jsonrpc:字符串,指定 JSON-RPC 的版本號,對于 2.0 規范來說,這個值必須是2.0。
- result:當請求成功時,包含由遠程方法返回的結果。如果請求失敗,則不包含此成員。
- error:當請求失敗時,包含一個錯誤對象。如果請求成功,則不包含此成員。
- id:與請求中的 id 相同,用于識別哪個請求對應的響應。
錯誤對象包括以下成員:
- code:整數,用于說明錯誤類型。JSON-RPC 2.0 定義了一組標準的錯誤碼。
- message:字符串,提供關于錯誤的簡短描述。
- data:可選,可以包含額外的錯誤信息,比如堆棧信息等。
一個成功的響應示例如下:
{"jsonrpc": "2.0","result": 19,"id": 1
}
而一個異常響應示例如下:
{"jsonrpc": "2.0","error": {"code": -32601,"message": "Method not found"},"id": 1
}
通知
通知是一種特殊類型的請求,沒有 id 成員,因此不會得到響應。這樣客戶端可以向服務器發送事件或命令而無需等待回復。一個通知示例如下:
{"jsonrpc": "2.0","method": "updateStatus","params": ["online"]
}
批量請求
JSON-RPC 2.0 支持批量請求,即可以在單個請求中發送多個 JSON-RPC 調用。每個調用都是獨立的 JSON-RPC 請求對象,被放在一個數組中。服務器處理這些請求后返回一個數組,其中每個元素對應于一個調用。需要注意的是,如果其中一個調用是通知,則不會有對應的響應項。
[{"jsonrpc": "2.0","method": "sum","params": [1, 3, 5, 7, 9],"id": "1"},{"jsonrpc": "2.0","method": "notify_hello","params": ["Alice"]},{"jsonrpc": "2.0","method": "subtract","params": [42, 23],"id": "2"}
]
錯誤碼
JSON-RPC 2.0 規范中定義了標準的錯誤碼,但開發者也可以根據自己的業務邏輯添加自定義的錯誤碼。這些自定義錯誤代碼應該在-32000到-32099之間,以避免與標準錯誤碼沖突。通過使用自定義錯誤碼,可以為客戶端提供更加具體的錯誤信息。
假如這樣一個場景,應用程序需要處理用戶認證失敗的情況,可以定義一個特定的錯誤碼,比如 -32001,并為這個錯誤碼配一個說明,如 Authentication failed。示例如下:
{"jsonrpc": "2.0","error": {"code": -32001,"message": "Authentication failed"},"id": "1"
}
此外,還可以在? error 的 data 參數中包含更多的錯誤細節,比如錯誤發生的具體位置或建議的解決方法。
JSON-RPC 2.0 定義的標準錯誤碼如下(自定義錯誤嗎不要使用如下幾個):
- -32700: 解析錯誤,服務器收到無效的 JSON。
- -32600: 無效請求,發送的 JSON 不是有效的請求對象。
- -32601: 方法未找到,方法不存在或無效。
- -32602: 無效參數,提供的參數無效。
- -32603: 內部錯誤,JSON-RPC 內部錯誤。
使用場景
JSON-RPC 2.0 的使用場景包括但不限于如下幾個:
- Web 應用程序,客戶端與服務器之間的異步通信,例如瀏覽器與后端服務交互。
- 微服務之間的通信,通過 JSON-RPC 調用其他微服務的接口。
- 物聯網設備,設備與服務器之間的通信,由于 JSON-RPC 的輕量級特性,非常適合資源受限的設備。
- 移動應用,移動客戶端與服務器之間的交互,減少數據傳輸量,提高響應速度。
- 區塊鏈和加密貨幣,節點之間的通信或客戶端與節點的交互,許多區塊鏈系統(如以太坊)使用 JSON-RPC 進行接口調用。
- 遠程過程調用(RPC)服務,替代傳統的 SOAP 或 XML-RPC,提供簡單的接口調用機制。
文檔和版本控制
良好的文檔對于任何 API 都至關重要,尤其是像 JSON-RPC 2.0 這樣依賴于明確的請求和響應格式的協議。
- 編寫清晰的 API 文檔:詳細描述每個方法的用途、參數、返回值和可能的錯誤情況。可以使用工具如 Swagger 或 Postman 來生成交互式的 API 文檔。
- 保持文檔更新:隨著 API 的發展,確保文檔始終保持最新狀態,反映最新的變更和改進。
- 版本控制:為 API 引入版本控制,以便在不影響現有用戶的情況下進行更新。可以在 URL 中或通過請求頭指定 API 版本。
社區和支持
JSON-RPC 2.0 是一個開放的標準,擁有活躍的社區和豐富的資源。參與社區討論、閱讀官方文檔和技術博客、關注相關論壇和社交媒體,都可以幫助更快地解決問題,并獲取最新的最佳實踐。
此外,很多流行的編程語言和框架都有現成的 JSON-RPC 庫,可以大大簡化開發過程。選擇一個成熟且維護良好的庫,不僅可以節省時間,還能減少出錯的可能性。
小結
JSON-RPC 2.0作為一種輕量級的 RPC 協議,提供了如標準化的錯誤處理、批量請求支持和通知機制等功能,具有簡單、易用、跨語言等優點,適用于多種分布式系統場景。
參考資料
- https://www.jsonrpc.org/specification