JSON-RPC 1.0 规范
JSON-RPC 1.0 是一种远程过程调用(RPC)协议,使用 JSON(JavaScript Object Notation)作为数据交换格式。下面是 JSON-RPC 1.0 的一些基本规范:
1. 请求格式:
- 必须是一个 JSON 对象。
- 必须包含以下字段:
- "method":表示要调用的方法名。
- "params":表示传递给方法的参数,可以是一个数组或对象。
- "id":表示请求的唯一标识符,可以是一个字符串、数值或 null。
2. 响应格式:
- 必须是一个 JSON 对象。
- 必须包含以下字段:
- "result":表示方法调用的结果,可以是任意类型。
- "error":表示方法调用的错误,如果没有错误则为 null。
- "id":与请求中的 id 字段相对应。
3. 错误处理:
- 如果方法调用成功,则 "error" 字段必须为 null。
- 如果方法调用失败,则 "result" 字段必须为 null,"error" 字段包含一个描述错误的对象,包括以下字段:
- "code":表示错误代码,通常是一个数值。
- "message":表示错误的描述信息,通常是一个字符串。
- "data":表示额外的错误数据,可以是任意类型。
4. 批量请求:
- 可以同时发送多个请求,以数组形式包含在一个 JSON 对象中。
- 每个请求都遵循上述请求格式。
- 响应也以数组形式包含在一个 JSON 对象中,与请求的顺序对应。
示例:
以下是一个示例,展示了符合 JSON-RPC 1.0 规范的请求和响应:
1. 请求示例:
"method": "subtract",
"params": [42, 23],
"id": 1
}
2. 响应示例(成功):
"result": 19,
"error": null,
"id": 1
}
3. 响应示例(错误):
"result": null,
"error": {
"code": -32600,
"message": "Invalid Request"
},
"id": 1
}
在这个示例中,请求包含了一个名为 "subtract" 的方法,参数为 [42, 23],并且请求的唯一标识符为 1。响应中的 "result" 字段表示方法调用的结果,如果成功则为结果值,如果失败则为 null。"error" 字段表示方法调用的错误,如果成功则为 null,如果失败则包含一个描述错误的对象,其中包含错误代码和错误消息。最后,"id" 字段与请求中的唯一标识符相对应,用于将响应与请求关联起来。
JSON-RPC 2.0 规范:
以下是 JSON-RPC 2.0 的规范:
1. 请求格式:
- 必须是一个 JSON 对象。
- 必须包含以下字段:
- "jsonrpc":表示 JSON-RPC 版本,必须为 "2.0"。
- "method":表示要调用的方法名。
- "params":表示传递给方法的参数,可以是一个数组或对象。
- "id":表示请求的唯一标识符,可以是一个字符串、数值或 null。
示例请求:
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
}
2. 响应格式:
- 必须是一个 JSON 对象。
- 必须包含以下字段:
- "jsonrpc":表示 JSON-RPC 版本,必须为 "2.0"。
- "result":表示方法调用的结果,可以是任意类型。
- "error":表示方法调用的错误,如果没有错误则为 null。
- "id":与请求中的 id 字段相对应。
示例响应(成功):
"jsonrpc": "2.0",
"result": 19,
"id": 1
}
示例响应(错误):
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "Invalid Request"
},
"id": 1
}
3. 错误处理:
- 如果方法调用成功,则 "error" 字段必须为 null。
- 如果方法调用失败,则 "result" 字段必须为 null,"error" 字段包含一个描述错误的对象,包括以下字段:
- "code":表示错误代码,通常是一个数值。
- "message":表示错误的描述信息,通常是一个字符串。
- "data":表示额外的错误数据,可以是任意类型。
4. 批量请求:
- 可以同时发送多个请求,以数组形式包含在一个 JSON 对象中。
- 每个请求都遵循上述请求格式。
- 响应也以数组形式包含在一个 JSON 对象中,与请求的顺序对应。
示例批量请求:
"jsonrpc": "2.0",
"method": "sum",
"params": [1, 2, 4],
"id": "1"
},
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": "2"
}
]
示例批量响应:
"jsonrpc": "2.0",
"result": 7,
"id": "1"
},
{
"jsonrpc": "2.0",
"result": 19,
"id": "2"
}
]
GitHub 代码库:https://github.com/haywire/jsonrpc-c
代码测试编译结果:
------------------------------------------
[2023-09-12 16:36:14.497]# SEND ASCII>
{"method":"sayHello"}
[2023-09-12 16:36:14.500]# RECV ASCII>
{
"result": "Hello!"
}
------------------------------------------
[2023-09-12 16:36:52.540]# SEND ASCII>
{"method":"exit"}
[2023-09-12 16:36:52.543]# RECV ASCII>
{
"result": "Bye!"
}
------------------------------------------