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.mzph.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的功能有:合并,分割,加…