(译) JSON-RPC 2.0 规范(中文版)

2023-11-09

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

包含关于错误附加信息的基本类型或结构化类型。该成员可忽略。
该成员值由服务端定义(例如详细的错误信息,嵌套的错误等)。

-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

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(译) JSON-RPC 2.0 规范(中文版) 的相关文章

  • 今日头条最新signature

    最新今日头条sign加密更新了 抽时间看了看 比上次的加密难度增加了许多 接下来讲下加密流程 今日头条获取下一页面的数据时断点位置 我们只需要找到window byted acrawler的生成就可以了 用fiddler拦击服务器返回的的r
  • Sortablejs实现vue项目表格拖动排序

    1 简介 Sortable js是一款优秀的js拖拽库 支持ie9及以上版本ie浏览器和现代浏览器 也可以运行在移动触摸设备中 不依赖jQuery 支持 Meteor AngularJS React Vue Knockout框架和任何CSS
  • Tomcat 9 免安装版 配置教程

    1 首先进入到https tomcat apache org 下载对应版本的TomCat 的 zip 包 解压到PC某个文件夹中 2 进入到目录 解压路径 bin 下 如我的路径参考 D Tomcat apache tomcat 9 0 6
  • Android 使用 okhttp3和retrofit2 进行单文件和多文件上传

    目录 前言 一 单文件上传 二 多文件上传 总结 前言 开发项目中需要进行单文件多文件的上传功能 下面演示的ApiResponse是自己分装的返回值 要根据自己的项目来完成 使用的mvvm框架 kotlin协程 看下大体思路和传参形式 仅供
  • leetcode刷题(9.24总结)

    1 相交链表 题目描述 https leetcode cn problems intersection of two linked lists class Solution def getIntersectionNode self head
  • 不平衡数据处理技术——RUSBoost

    RUSBoost是一个非常简单的针对不平衡数据集的算法 算法如其名 就是RUS Boost RUS random undersampling 随机欠抽样 随机从数据集中抽取一定量的多数类样本和少数类组成平衡分布的训练数据集 Boost 指的
  • linux 给lvm磁盘扩容

    目录 linux 给lvm磁盘扩容 扩容步骤 确认可用空间 创建新的物理卷 将物理卷添加到现有的卷组中 扩展逻辑卷 linux 给lvm磁盘扩容 早上到公司发现磁盘满了 挂载点是一个lvm 跟领导确认后决定先扩容再清理 原先是1T 决定扩容
  • oRACLE错误怎么办,Oracle的常见错误及解决办法

    ORA 12528 TNS listener all appropriate instances are blocking new connections ORA 12528问题是因为监听中的服务使用了动态服务 实例虽然启动 但没有注册到监
  • 解决adbd cannot run as root in production builds问题

    1 验证你的手机是否已经root了 adb shell su 行命令后 变为 即 表示root 成功 2 安装adbd insecure apk adb install adbd insecure apk 3 设置 打开应用将Enable
  • 集成公告|多链NFT游戏Blockchain Monster Hunt即将上线Moonbeam

    用户现可在Moonbase Alpha测试网体验Blockchain Monster Hunt游戏 并计划将于明年Moonbeam启动后上线Moonbeam平台 Moonbeam宣布支持多链NFT游戏Blockchain Monster H
  • 【弱网测试】

    弱网测试简介 1 测试方法及工具 随着互联网的快速发展 越来越多的应用核心功能需要联网实现 现在的网络制式有2G 3G 4G 5G 还有越来越多的公众WiFi 不同的网络环境和网络制式的差异都会对用户使用APP造成一定的影响 弱网测试作为健
  • [Codeforces 1579G] Minimal Coverage

    You are given n lengths of segments that need to be placed on an infinite axis with coordinates The first segment is pla
  • 爬虫获取电影数据----以沈腾参演电影为例

    数据可视化 分析实战 1 1 沈腾参演电影数据获取 1 2 电影数据可视化分析 文章目录 数据可视化 分析实战 前言 1 网页分析 2 构建数据获取函数 2 1 网页数据获取函数 2 2 网页照片获取函数 3 获取参演影视作品基本数据 4
  • Linux的c编程-文件节点的打开与读写操作

    1 open 打开文件 相关函数 read write fcntl close link stat umask unlink fopen 表头文件 include
  • Python实现简单爬虫功能

    在我们日常上网浏览网页的时候 经常会看到一些好看的图片 我们就希望把这些图片保存下载 或者用户用来做桌面壁纸 或者用来做设计的素材 我们最常规的做法就是通过鼠标右键 选择另存为 但有些图片鼠标右键的时候并没有另存为选项 还有办法就通过就是通
  • 如何用php请求gpt接口

    定义GPT接口地址和参数 url https api openai com v1 completions data array prompt gt Once upon a time max tokens gt 5 temperature g
  • 清除HTML的超链接样式,Markdown导出HTML,删除超链接下划线和字体样式

    使用Markdown生成的HTML含有超链接的下划线 如下图 将Markdown导出的HTML文件放置在Blog文章中时 Markdown文件的超链接下划线样式会影响整个页面的超链接下划线样式 如下图 修改方法是 将Markdown导出的H
  • Quaternion.Euler(0, 90, 0)*Vector3(0.0, 0.0, -10)

    Quaternion Euler x y z 返回一个绕x轴旋转x度再绕y轴旋转y度再绕z轴旋转z度的Quaternion 因此Quaternion Euler 0 90 0 返回一个绕y轴旋转90度的旋转操作 Quaternion作用于V
  • nginx 显示php错误日志,nginx php-fpm 输出php错误日志-php教程

    nginx是一个web效劳器 因而nginx的access日记只有对拜访页面的记载 没有会有php 的 error log信息 nginx把对php的申请发给php fpm fastcgi过程来解决 默许的php fpm只会输入php fp
  • 2021蓝桥杯模拟赛-删除字符

    题目 题目链接 题解 贪心 贪心思路 将整个字符串视为若干段降序排列的子串 即 从左边开始向右遍历 遇到逆序的就删除 再对新的串从头遍历找逆序 不停地重复整个过程是为了保证删除的尽可能靠前 贪心 如果整个字符串都顺序了 但是还要删 那么就从

随机推荐