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

http://wiki.geekdream.com/Specification/json-rpc_2.0.html

?

  • 起源時間: 2010-03-26(基于2009-05-24版本)

  • 更新: 2013-01-04

  • 作者:?JSON-RPC工作組< json-rpc@googlegroups.com >

  • 原文鏈接:?http://www.jsonrpc.org/specification
  • 翻譯:?leozvc?< xxfs91@gmail.com >

1.概述

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

?

它為簡單而生!

2.約定

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

由于JSON-RPC使用JSON,它具有與其相同的類型系統(見http://www.json.org或RFC 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

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

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

codemessagemeaning
-32700Parse error語法解析錯誤服務端接收到無效的json。該錯誤發送于服務器嘗試解析json文本
-32600Invalid Request無效請求發送的json不是一個有效的請求對象。
-32601Method not found找不到方法該方法不存在或無效
-32602Invalid params無效的參數無效的方法參數。
-32603Internal error內部錯誤JSON-RPC內部錯誤。
-32000 to -32099Server 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 

7.擴展

以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.

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

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

相關文章

ios pusher使用_如何使用JavaScript和Pusher實時更新用戶狀態

ios pusher使用by Rahat Khanna通過拉哈特漢娜 如何使用JavaScript和Pusher實時更新用戶狀態 (How to update a User’s Status in realtime using JavaScript and Pusher) “Hey, what’s up?” is not a phrase we need to ask someone these days. These days knowing wha…

python + pyqt5 UI和信號槽分離方法

初級菜鳥&#xff0c;知識點記錄。 每次重新生成UI.py文件的時候&#xff0c;里面的按鈕方法都會被清除&#xff0c;想一個方法可以把按鈕響應方法放到外面&#xff0c;利于維護。 新建一個按鈕文件并繼承UI代碼&#xff0c;把信號槽及按鈕響應方法寫在按鈕文件里面&#xff0c…

學習之路~sqh

推薦博客 Edison Chou&#xff1b;Vamei&#xff1b;算法?面試專題 - 簡書&#xff1b;xingoo - 博客園&#xff1b;設計模式 極速理解設計模式系列【目錄索引】- Caleung&#xff1b;Net設計模式 - 靈動生活&#xff1b;宅男程序員給老婆的計算機課程系列&#xff1b;C設計模…

python format函數保留兩位小數_python format函數

在Python 3.0中&#xff0c;%操作符通過一個更強的格式化方法format()進行了增強。對str.format()的支持已經被反向移植到了Python 2.6在2.6中&#xff0c;8-bit字符串和Unicode字符串都有一個format()方法&#xff0c;這個方法會把字符串當作一個模版&#xff0c;通過傳入的參…

藍牙 sig base uuid_藍牙模塊采用陶瓷天線和PCB天線的區別

一、陶瓷天線陶瓷天線是一種適合于藍牙設備使用的小型化天線,又分為塊狀陶瓷天線和多層陶瓷天線。陶瓷天線占用空間很小、性能比較好&#xff1b; 帶寬窄&#xff0c;比較難做到多頻段&#xff1b;有效提高主板的整合度&#xff0c;并可降低天線對ID的限制&#xff1b;需要在主…

kubernetes系列12—二個特色的存儲卷configmap和secret

本文收錄在容器技術學習系列文章總目錄 1、configmap 1.1 認識configmap ConfigMap用于保存配置數據的鍵值對&#xff0c;可以用來保存單個屬性&#xff0c;也可以用來保存配置文件。ConfigMap跟secret很類似&#xff0c;但它可以更方便地處理不包含敏感信息的字符串。 1.2 創建…

華為完成拉美銅網寬帶G.fast技術部署測試

1/11/2016,英國大東通信巴拿馬分公司日前與華為公司發布消息稱&#xff0c;覆蓋拉丁美洲地區的最快銅纜寬帶服務系統成功完成初次測試。 作為巴拿馬地區領先的移動寬帶服務提供商&#xff0c;大東通信巴拿馬分公司也是當地最大的電信服務提供商&#xff0c;此次與華為合作在現有…

kotlin調用類中的方法_一種輕松的方法來測試Kotlin中令人沮喪的靜態方法調用

kotlin調用類中的方法by Oleksii Fedorov通過Oleksii Fedorov 一種輕松的方法來測試Kotlin中令人沮喪的靜態方法調用 (A stress-free way to test frustrating static method calls in Kotlin) Let me make a wild guess… You have encountered some code in Kotlin that is …

python圖像加密模塊_使用Pycryp的圖像加密和解密

這和加密或解密文本是一樣的。示例首先導入一些模塊&#xff1a;from Crypto.Cipher import AESfrom Crypto import Random然后&#xff0c;讓我們生成一個鍵和一個初始化向量。key Random.new().read(AES.block_size)iv Random.new().read(AES.block_size)加密下面的代碼加載…

遇到attemp to invoke virtual method

這個很大原因是沒有預先初始化sdk&#xff0c;檢查application的配置是否配置了application&#xff1a;name 轉載于:https://www.cnblogs.com/caimuqing/p/5894099.html

app啟動頁自動跳轉源碼_關于移動端App啟動頁的策劃方案

App啟動頁是指app在啟東時需要加載必要的運行環境和配置&#xff0c;在這個過程中提示用戶等待的一個過渡頁面。在產品經理眼里啟動頁是app給予用戶重要的第一印象&#xff1b;也是App最重要的黃金頁面之一&#xff0c;所有用戶100%都會看到的頁面。啟動頁適合用來做以下幾個事…

電信運營商占IDC市場65%:中國電信占行業半數以上

隨著云計算、大數據的快速發展&#xff0c;作為重要基礎設施的IDC數據中心也在高速擴張。 近日&#xff0c;DCA常務理事長何寶宏介紹&#xff0c;我國規劃在建數據中心共計246個&#xff0c;總設計機架數約為103萬個&#xff0c;總設計服務器規模約1326萬臺。在用超大型、大型數…

Python 日期和時間戳的轉換

Python 日期和時間戳的轉換 1. Python中處理時間的模塊 Python中處理時間的模塊有time、datetime和calendar。 在Python中表示時間的方式&#xff1a; 時間戳&#xff1a;10位整數位和若干小數位&#xff0c;例如 1551153156.6358607元組&#xff08;struct_time&#xff09;: …

快應用比賽_我的應用如何在國際學生比賽中獲得第三名

快應用比賽by Rafael Melo通過拉斐爾梅洛 我的應用如何在國際學生比賽中獲得第三名 (How my App won third place in an International Student Competition) I developed an App that won third place at the IEEE Mobile Applications Development Contest 2017 (IEEEmadC 2…

JAVA中String類的intern()方法的作用

一般我們變成很少使用到 intern這個方法&#xff0c;今天我就來解釋一下這個方法是干什么的&#xff0c;做什么用的 首先請大家看一個例子&#xff1a; public static void main(String[] args) throws Exception { String a "b" ; String b "b" ; …

java 如何排查內存溢出_java 內存溢出排查

測試代碼&#xff0c;如下示例&#xff1a;import java.util.ArrayList;import java.util.List;/*** Description 測試內存溢出, 啟動時設置參數&#xff0c;最大堆內存為1m, 內存溢出時dump出內存文件 -Xmx1m -XX:HeapDumpOutOfMemoryError* Author luzy* Date 2018/10/5 11:0…

《企業級ios應用開發實戰》一2.2 iOS框架介紹

2.2 iOS框架介紹 iOS衍生自Mac OS X的成熟內核&#xff0c;但iOS操作系統更緊湊和高效&#xff0c;支持iPhone和iPod Touch的硬件。iOS繼承了Mac OS X的風格&#xff0c;包括&#xff1a;統一的OS X 內核&#xff0c;針對網絡的BSD套接字&#xff0c;以及Objective-C和C/C編譯器…

python的opencv 車牌識別 開源_畢節進出口車牌識別系統怎么樣

畢節進出口車牌識別系統怎么樣 gzheu8il畢節進出口車牌識別系統怎么樣 系統拓撲圖如下&#xff1a;該系統以社區中心機房為樞紐&#xff0c;有機的將智慧家居住戶、社區數字化服務、物業數字化管理、社區智能化管理結合起來&#xff0c;真正的實現&#xff1a;住戶與住戶之間的…

了解使用JavaScript進行面向對象編程的基礎(并增強您的編碼…

by Kris Baillargeon通過克里斯拜倫 學習使用JavaScript進行面向對象編程的基礎知識(并增強您的編碼能力&#xff01;) (Learn the basics of object-oriented programming with JavaScript (and supercharge your coding abilities!)) As a moderator of the freeCodeCamp ch…

postgresql的別名要用雙引號才可以

postgresql的別名要用雙引號""才可以 轉載于:https://www.cnblogs.com/handsome1013/p/10443001.html