它为大略而生!

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也要大写。

php实现并发jsonrpc译 JSONRPC 20 规范中文版 GraphQL

在客户端与任何被匹配到的做事端之间交流的所有成员名字应是区分大小写的。
函数、方法、过程都可以认为是可以互换的。

客户端被定义为要求工具的来源及相应工具的处理程序。

做事端被定义为相应工具的起源和要求工具的处理程序。

该规范的一种实现为可以轻而易举的补充这两个角色,纵然是在同一韶光,同一客户端或其他不相同的客户端。
该规范不涉及繁芜层。

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

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 batches8.扩展

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