JSON-RPC 2.0 規范中文版——無狀態輕量級遠程過程調用協議

前言

JSON-RPC是一種簡單、輕量且無狀態的遠程過程調用(RPC)協議,它允許不同系統通過標準化的數據格式進行通信。自2010年由JSON-RPC工作組發布以來,已成為眾多應用中實現遠程交互的基礎協議之一。本規范主要表達了JSON-RPC 2.0版本的核心內容和處理規則,以保證各實現之間的兼容性和基礎一致性。

本文由翻譯者整理并編輯,旨在幫助中文讀者理解和掌握JSON-RPC 2.0的技術細節與使用規范。


一、概述

JSON-RPC是建立在JSON(JavaScript Object Notation)之上的一種協議(符合RFC 4627),它定義了一套數據結構和交互規則,支持多種傳輸協議(如HTTP、WebSocket、TCP socket等)。其特點如下:

  • 無狀態(Stateless):每個請求都獨立,無依賴歷史狀態。
  • 輕量級(Lightweight):沒有繁瑣的通信機制,只有必要的數據結構。
  • 跨平臺:可以運行在任意支持JSON的環境中。
  • 多角色支持:既可以是客戶端,也可以是服務端,也可以在同一應用內部既充當請求者又承擔服務角色。

二、約定與用語

本規范中涉及的關鍵詞在RFC 2119中定義,表示其強制性或推薦性。例如:

  • MUST:必須
  • SHALL:強制要求
  • SHOULD:建議
  • MAY:可選

JSON類型

  • Primitive(基本類型):String、Number、Boolean、Null
  • Structured(結構化類型):Object(對象)、Array(數組)

在文檔中,標記為“Object”、“Array”、“String”、“Number”、“Boolean”、“Null”的類型名,首字母必須大寫。

名稱區分大小寫

所有成員名(字段名)必須區分大小寫。

角色定義

  • 客戶端(Client):請求發起方,發起請求,并處理響應。
  • 服務端(Server):請求應答方,接受請求并發出響應。

三、版本兼容性

JSON-RPC 2.0定義了請求和響應的結構,若要與舊版本(1.0)兼容:

  • 2.0請求對象必須包含"jsonrpc": "2.0"字段。
  • 1.0版本不包含該字段。
  • 實現應嘗試處理1.0格式請求,但優先處理2.0格式。

四、請求對象(Request Object)

客戶端發起遠程調用時,使用請求對象進行描述。請求對象具有以下成員:

成員名類型說明是否必須
jsonrpcString協議版本,必須為字符串"2.0"必須
methodString方法名,代表要調用的遠程方法名(內部方法用開頭“rpc.”做前綴)必須
paramsArray或Object(可選)調用參數,可以是數組(索引參數)或對象(命名參數)可選
idString、Number或Null客戶端唯一標識符,用于匹配請求與響應,通知請求沒有此字段或用Null可選(通知沒有)

請求通知(Notification)

如果請求對象沒有"id"字段,則為通知。通知代表客戶端不需要響應結果,服務端無須返回響應。

示例

 

// 正常請求 { "jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1 }

 

// 通知 { "jsonrpc": "2.0", "method": "update", "params": [1, 2, 3] }

五、響應對象(Response Object)

服務端對請求的回應,以響應對象形式出現。響應對象有以下成員:

成員名類型說明是否必須
jsonrpcString協議版本,必須為字符串"2.0"必須
result任意類型(成功時存在)調用成功后的返回值可選
errorError對象(失敗時存在)出現錯誤時的錯誤信息,不能與result同時出現可選
idString、Number或Null請求中的id,用于匹配請求(通知沒有此字段或用Null)必須

成功響應

 

{ "jsonrpc": "2.0", "result": 19, "id": 1 }

失敗響應(錯誤對象)

 

{ "jsonrpc": "2.0", "error": { "code": -32601, "message": "Method not found" }, "id": 1 }

ID對應關系說明

  • 若請求中id是字符串或數字,響應中應保持一致,確保客戶端可以正確匹配。
  • 通知請求不應有響應。

六、錯誤對象(Error Object)

錯誤信息定義如下:

成員名類型說明是否必須
codeInteger錯誤類型代碼,用于區分錯誤類別必須
messageString簡要描述錯誤信息必須
data任意類型可選,附加錯誤信息(嵌套結構、詳細信息等)可選

預定義錯誤碼

碼值描述說明
-32700Parse error(解析錯誤)JSON格式不正確,解析失敗
-32600Invalid Request(無效請求)請求結構無效或格式錯誤
-32601Method not found(方法不存在)調用的方法未定義
-32602Invalid params(參數無效)參數不符合預期
-32603Internal error(內部錯誤)服務器內部錯誤
-32000至-32099Server error(服務器錯誤)預留用于定義自定義錯誤碼

七、批量請求(Batch)

批量請求允許一次發起多個請求或通知,服務端將會逐個處理,并返回包含所有響應的數組。

特點

  • 請求體為數組,每個元素都是請求或通知對象。
  • 只要有一個請求無效,返回的響應數組中會對應錯誤。
  • 通知(無id請求)沒有響應。
  • 可以混合請求和通知。

舉例

 

[ { "jsonrpc": "2.0", "method": "sum", "params": [1, 2, 3], "id": "1" }, { "jsonrpc": "2.0", "method": "notify_hello", "params": [7] }, { "jsonrpc": "2.0", "method": "subtract", "params": [10, 5], "id": "2" } ]

對應的響應:

 

[ { "jsonrpc": "2.0", "result": 6, "id": "1" }, // 通知無響應 { "jsonrpc": "2.0", "result": 5, "id": "2" } ]

特別留意:

  • 若請求數組為空或無效,服務端應返回錯誤響應(非數組)。
  • 批量中所有通知都沒有響應(集合為空),也不返回任何內容。

八、示例:常用調用場景

  • 正常調用
 

{"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}

  • 通知調用
 

{"jsonrpc": "2.0", "method": "update", "params": [1, 2, 3]}

  • 錯誤示例
    請求中包含無效JSON或缺失必要字段,解析失敗:
 

{"jsonrpc": "2.0", "method": "unknown_method", "params": {}, "id": 10}

服務端響應:

 

{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": 10}

九、擴展機制

rpc開頭的方法名保留給系統擴展,不應在正常業務調用中使用。所有擴展都應有對應的文檔說明,且實現為可選。


十、版權聲明

本協議由JSON-RPC工作組首次發布,任何人可自由使用、復用、修改,須包含版權聲明并遵守共享協議。

結語

JSON-RPC 2.0以其簡潔、靈活的設計理念,為各種應用提供了標準的遠程調用解決方案。理解并正確使用該協議,可以極大豐富你的系統交互能力,提升開發效率。


附錄:常用誤區和注意事項

  • 不要在通知中使用id字段,否則會被誤認為是請求。
  • params可以為數組或對象,根據API設計需要選擇。
  • 保持jsonrpc字段的版本一致,避免兼容性問題。
  • 正確處理錯誤碼和錯誤消息,提升調試效率。
  • 充分利用批量操作和通知機制,優化通信效率。

這份詳細的JSON-RPC 2.0規范中文版旨在幫助開發者深入理解協議本質,正確實現與使用。希望你能在實際項目中靈活應用這一標準,搭建高效、可靠的分布式系統。


版權及免責聲明:本文內容參考自官方規范及公開資源,所有內容旨在教育和技術交流,非商業用途。如有侵權,請聯系刪除。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903562.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微控制器編程 | ISP、IAP 與 ICP 的原理與比較

注:英文引文,機翻未校。 圖片清晰度限于引文原狀。 Introduction to Programming of Microcontroller: ISP, IAP and ICP 微控制器編程介紹:ISP、IAP 和 ICP Date: 30-11-2022 1. What is Microcontroller Programming 什么是微控制器編…

Allegro23.1新功能之新型via structure創建方法操作指導

Allegro23.1新功能之新型via structure創建方法操作指導 Allegro升級到了23.1后,支持創建新型via structure 通過直接定義參數來生成 具體操作如下 打開軟件,選擇 Allegro PCB Designer

IBM WebSphere Application Server 7.0/8.5.5證書過期問題處理

證書過期錯誤日志: [3/14/16 7:22:20:332 PDT] 0000007d WSX509TrustMa E CWPKI0312E: The certificate with subject DN CNMXSYSTEMS, OUctgNodeCell01, OUctgNode01, OIBM, CUS has an end date Mon Jan 11 11:17:18 PST 2016 which is no longer valid. [3/14/…

select,poll,epoll區別聯系

selsect,poll,epoll區別聯系 目錄 一、區別 二、聯系 select、poll 和 epoll 都是在 Linux 系統中用于實現 I/O 多路復用的機制,它們的主要目的是讓程序能夠同時監控多個文件描述符,以判斷是否有事件發生,從而提高 I/O 操作的效率。 一、區…

curl和wget的使用介紹

目錄 一、curl 和 wget 區別 二、wget的使用 2.1 參數說明 2.2 wget 使用示例 三、curl的使用 3.1 參數說明 3.2 curl使用示例 一、curl 和 wget 區別 wget 和 curl 都可以下載內容。它們都可以向互聯網發送請求并返回請求項,可以是文件、圖片或者是其他諸如…

日語學習-日語知識點小記-構建基礎-JLPT-N4階段(12): ておき ます

日語學習-日語知識點小記-構建基礎-JLPT-N4階段(12): ておき ます。 1、前言(1)情況說明(2)工程師的信仰 2、知識點(1)~ておき ます。(2&#x…

高質量水火焰無損音效包

今天設計寶藏給大家分享的是Cinematic Elements: Fire & Water音頻資源庫包含大量高質量的火焰和水的聲音效果。它具有非常強烈的個性特征和次世代的音效。火焰和水是兩個令人印象深刻而 interessing 的元素。它們的表現形式從微小無害到巨大毀滅性都有。因此,它們的聲音特…

畢業論文 | 傳統特征點提取算法與匹配算法對比分析

傳統特征點提取算法與匹配算法對比分析 一、特征點提取算法對比二、特征匹配算法對比三、核心算法原理與公式1. **Harris角點檢測**2. **SIFT描述子生成**3. **ORB描述子**四、完整Matlab代碼示例1. **Harris角點檢測與匹配**2. **SIFT特征匹配(需VLFeat庫)**3. **ORB特征匹配…

【網絡原理】從零開始深入理解HTTP的報文格式(二)

本篇博客給大家帶來的是網絡HTTP協議的知識點, 續上篇文章,接著介紹HTTP的報文格式. 🐎文章專欄: JavaEE初階 🚀若有問題 評論區見 ? 歡迎大家點贊 評論 收藏 分享 如果你不知道分享給誰,那就分享給薯條. 你們的支持是我不斷創作的動力 . 王子,公主請閱…

Microsoft .NET Framework 3.5 離線安裝包 下載

Microsoft. NET Framework 3.5 是支持生成和運行下一代應用程序和XML Web Services 的內部Windows 組件, 對 .NET Framework 2.0 和 3.0 中的許多新功能進行了更新和增補, 且附帶了 .NET Framework 2.0 Service Pack 1 和 .NET Framework 3.0 Service…

Flask + ajax上傳文件(三)--圖片上傳與OCR識別

本教程將詳細介紹如何使用Flask框架構建一個圖片上傳與文字識別(OCR)的Web應用。我們將使用EasyOCR作為OCR引擎,實現一個支持中文和英文識別的完整應用。 環境準備 首先,確保你已經安裝了Python 3.7+環境,然后安裝必要的依賴庫: pip install flask easyocr pillow werkz…

模型部署技巧(一)

模型部署技巧(一) 以下內容是參考CUDA與TensorRT模型部署內容第六章,主要針對圖像的前/后處理中的trick。 參考: 1.部署分類器-int8-calibration 2. cudnn安裝地址 3. 如何查找Tensor版本,與cuda 和 cudnn匹配 4. ti…

MySQL--數據引擎詳解

存儲引擎 MySQL體系結構 連接層: 主要接收客戶端的連接,然后完成一些鏈接的處理,以及認證授權的相關操作和安全方案,還要去檢查是否超過最大連接數等等,比如在連接MySQL服務器時需要輸入用戶名,密碼&#…

【含文檔+PPT+源碼】基于微信小程序的健康飲食食譜推薦平臺的設計與實現

項目介紹 本課程演示的是一款基于微信小程序的健康飲食食譜推薦平臺的設計與實現,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本…

當OA闖入元宇宙:打卡、報銷和會議的未來狂想

引言:虛實共生中的組織基因突變 元宇宙正以虛實共生的形態重構人類協作的底層邏輯。傳統OA系統建立的物理規則——指紋打卡驗證在場性、紙質票據堆砌信任鏈、會議室排期協調時空資源——在元宇宙的數字原野上迎來基因級重組。這場變革不僅是技術工具的迭代&#xf…

解決vscode cmake提示檢測到 #include 錯誤

一、問題 cmake已經包含了動態庫文件,依然提示“檢測到 #include 錯誤。請更新 includePath。” 二、解決方案 Ctrl Shift P進入CPP編輯配置,然后在JSON中加入下面一行: "configurationProvider": "ms-vscode.cmake-tools&…

2024ICPC成都題解

文章目錄 L. Recover Statistics(簽到)J. Grand Prix of Ballance(模擬簽到)A. Arrow a Row(構造)B. Athlete Welcome Ceremony(線性dp)G. Expanding Array(打表結論)I. Good Partitions(線段樹)E. Disrupting Communications(換根dpLCA倍增)K. Magical Set(費用流) 題目鏈接 …

達夢數據庫官方遷移工具SQLark:支持Oracle/MySQL/PostgreSQL遷移至達夢數據庫!

SQLark 百靈連接是一款面向信創應用開發者的數據庫開發和管理工具,由達夢數據歷時三年自主研發,注冊即可免費使用客戶端(官網鏈接www.sqlark.com)。今天,我們將重點介紹SQLark的特色功能之一——數據遷移,該…

映射關系4

好!我明白了!💥 你希望我在你的基礎上,繼續優化 insertPathWithIds,讓它: ? 支持每一級節點的 idPart 是字符串(而不是int)。 ? 結構更清晰,更快拼接。 ? 完全符合C98…

PDF Shaper v15.0

如今對PDF處理的軟件很多都是只是單一的功能。PDF Shaper給你完全不同的體驗,因為PDF Shaper是一款免費的PDF工具集合的軟件。有了PDF Shaper,你以后再也不用下載其他處理PDF的軟件了。PDF Shaper的功能有:合并,分割,加…