(譯) JSON-RPC 2.0 規范(中文版)

1.概述

JSON-RPC是一個無狀態且輕量級的遠程過程調用(RPC)協議。 本規范主要定義了一些數據結構及其相關的處理規則。它允許運行在基于socket,http等諸多不同消息傳輸環境的同一進程中。其使用JSONRFC 4627)作為數據格式。

它為簡單而生!

2.約定

文檔中關鍵字"MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"和 "OPTIONAL" 將在RFC 2119 中得到詳細的解釋及描述。

由于JSON-RPC使用JSON,它具有與其相同的類型系統(見http://www.json.orgRFC 4627)。JSON可以表示四個基本類型(String、Numbers、Booleans和Null)和兩個結構化類型(Objects和Arrays)。 規范中,術語“Primitive”標記那4種原始類型,“Structured”標記兩種結構化類型。任何時候文檔涉及JSON數據類型,第一個字母都必須大寫:Object,Array,String,Number,Boolean,Null。包括True和False也要大寫。

在客戶端與任何被匹配到的服務端之間交換的所有成員名字應是區分大小寫的。 函數、方法、過程都可以認為是可以互換的。

客戶端被定義為請求對象的來源及響應對象的處理程序。

服務端被定義為響應對象的起源和請求對象的處理程序。

該規范的一種實現為可以輕而易舉的填補這兩個角色,即使是在同一時間,同一客戶端或其他不相同的客戶端。 該規范不涉及復雜層。

3.兼容性

JSON-RPC 2.0 的請求對象和響應對象可能無法在現用的JSON-RPC 1.0 客戶端或服務端工作,然而我們可以很容易在兩個版本間區分出2.0,總會包含一個成員命名為 “jsonrpc” 且值為“2.0”, 而1.0版本是不包含的。大部分的2.0實現應該考慮嘗試處理1.0的對象,即使不是對等的也應給其相關提示。

4.請求對象

發送一個請求對象至服務端代表一個rpc調用, 一個請求對象包含下列成員:

jsonrpc

指定JSON-RPC協議版本的字符串,必須準確寫為“2.0”

method

包含所要調用方法名稱的字符串,以rpc開頭的方法名,用英文句號(U+002E or ASCII 46)連接的為預留給rpc內部的方法名及擴展名,且不能在其他地方使用。

params

調用方法所需要的結構化參數值,該成員參數可以被省略。

id

已建立客戶端的唯一標識id,值必須包含一個字符串、數值或NULL空值。如果不包含該成員則被認定為是一個通知。該值一般不為NULL[1],若為數值則不應該包含小數[2]

服務端必須回答相同的值如果包含在響應對象。 這個成員用來兩個對象之間的關聯上下文。

[1] 在請求對象中不建議使用NULL作為id值,因為該規范將使用空值認定為未知id的請求。另外,由于JSON-RPC 1.0 的通知使用了空值,這可能引起處理上的混淆。

[2] 使用小數是不確定性的,因為許多十進制小數不能精準的表達為二進制小數。

4.1通知

沒有包含“id”成員的請求對象為通知, 作為通知的請求對象表明客戶端對相應的響應對象并不感興趣,本身也沒有響應對象需要返回給客戶端。服務端必須不回復一個通知,包含那些批量請求中的。

由于通知沒有返回的響應對象,所以通知不確定是否被定義。同樣,客戶端不會意識到任何錯誤(例如參數缺省,內部錯誤)。

4.2參數結構

rpc調用如果存在參數則必須為基本類型或結構化類型的參數值,要么為索引數組,要么為關聯數組對象。

  • 索引:參數必須為數組,并包含與服務端預期順序一致的參數值。
  • 關聯名稱:參數必須為對象,并包含與服務端相匹配的參數成員名稱。沒有在預期中的成員名稱可能會引起錯誤。名稱必須完全匹配,包括方法的預期參數名以及大小寫。

5.響應對象

當發起一個rpc調用時,除通知之外,服務端都必須回復響應。響應表示為一個JSON對象,使用以下成員:

jsonrpc

指定JSON-RPC協議版本的字符串,必須準確寫為“2.0”

result

該成員在成功時必須包含。

當調用方法引起錯誤時必須不包含該成員。

服務端中的被調用方法決定了該成員的值。

error

該成員在失敗是必須包含。

當沒有引起錯誤的時必須不包含該成員。

該成員參數值必須為5.1中定義的對象。

id

該成員必須包含。

該成員值必須于請求對象中的id成員值一致。

若在檢查請求對象id時錯誤(例如參數錯誤或無效請求),則該值必須為空值。

響應對象必須包含result或error成員,但兩個成員必須不能同時包含。

5.1錯誤對象

當一個rpc調用遇到錯誤時,返回的響應對象必須包含錯誤成員參數,并且為帶有下列成員參數的對象:

code

使用數值表示該異常的錯誤類型。 必須為整數。

message

對該錯誤的簡單描述字符串。 該描述應盡量限定在簡短的一句話。

data

包含關于錯誤附加信息的基本類型或結構化類型。該成員可忽略。 該成員值由服務端定義(例如詳細的錯誤信息,嵌套的錯誤等)。

Col1

-32768至-32000為保留的預定義錯誤代碼。在該范圍內的錯誤代碼不能被明確定義,保留下列以供將來使用。錯誤代碼基本與XML-RPC建議的一樣,url: http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php

code message meaning
-32700 Parse error語法解析錯誤 服務端接收到無效的json。該錯誤發送于服務器嘗試解析json文本
-32600 Invalid Request無效請求 發送的json不是一個有效的請求對象。
-32601 Method not found找不到方法 該方法不存在或無效
-32602 Invalid params無效的參數 無效的方法參數。
-32603 Internal error內部錯誤 JSON-RPC內部錯誤。
-32000 to -32099 Server error服務端錯誤 預留用于自定義的服務器錯誤。

除此之外剩余的錯誤類型代碼可供應用程序作為自定義錯誤。

6.批量調用

當需要同時發送多個請求對象時,客戶端可以發送一個包含所有請求對象的數組。

當批量調用的所有請求對象處理完成時,服務端則需要返回一個包含相對應的響應對象數組。每個響應對象都應對應每個請求對象,除非是通知的請求對象。服務端可以并發的,以任意順序和任意寬度的并行性來處理這些批量調用。

這些相應的響應對象可以任意順序的包含在返回的數組中,而客戶端應該是基于各個響應對象中的id成員來匹配對應的請求對象。

若批量調用的rpc操作本身非一個有效json或一個至少包含一個值的數組,則服務端返回的將單單是一個響應對象而非數組。若批量調用沒有需要返回的響應對象,則服務端不需要返回任何結果且必須不能返回一個空數組給客戶端。

7.示例

Syntax:

--> data sent to Server
<-- data sent to Client

帶索引數組參數的rpc調用:

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

--> {"jsonrpc": "2.0", "method": "subtract", "params": [23, 42], "id": 2}
<-- {"jsonrpc": "2.0", "result": -19, "id": 2}

帶關聯數組參數的rpc調用:

--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}
<-- {"jsonrpc": "2.0", "result": 19, "id": 3}

--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4}
<-- {"jsonrpc": "2.0", "result": 19, "id": 4}

通知:

--> {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]}
--> {"jsonrpc": "2.0", "method": "foobar"}

不包含調用方法的rpc調用:

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

包含無效json的rpc調用:

--> {"jsonrpc": "2.0", "method": "foobar, "params": "bar", "baz]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}

包含無效請求對象的rpc調用:

--> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}

包含無效json的rpc批量調用:

--> [
        {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
        {"jsonrpc": "2.0", "method"
    ]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}

包含空數組的rpc調用:

--> []
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
非空且無效的rpc批量調用:

--> [1]
<-- [
    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
    ]

無效的rpc批量調用:

--> [1,2,3]
<-- [
    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
    ]

rpc批量調用:

--> [
    {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
    {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
    {"foo": "boo"},
    {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
    {"jsonrpc": "2.0", "method": "get_data", "id": "9"}
    ]
<-- [
    {"jsonrpc": "2.0", "result": 7, "id": "1"},
    {"jsonrpc": "2.0", "result": 19, "id": "2"},
    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
    {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},
    {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
    ]

所有都為通知的rpc批量調用:

--> [
    {"jsonrpc": "2.0", "method": "notify_sum", "params": [1,2,4]},
    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}
]

<-- //Nothing is returned for all notification batches

8.擴展

以rpc開頭的方法名預留作為系統擴展,且必須不能用于其他地方。每個系統擴展都應該有相關規范文檔,所有系統擴展都應是可選的。

Copyright (C) 2007-2010 by the JSON-RPC Working Group

This document and translations of it may be used to implement JSON-RPC, it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not bemodified in any way.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容