1. RPC介绍
- 所谓的RPC,
Remote Procedure Call
的简写,中文译作远程过程调用或者远程服务调用。 - 直观的理解就是,通过网络请求远程服务,获取指定接口的数据,而不用知晓底层网络协议的细节。
RPC
支持的格式很多,比如XML
格式,JSON
格式等等。最常用的肯定是json-rpc。
2. Flask-JSONRPC模块介绍
2.1 介绍
- JSON-RPC是一个无状态的、轻量级的远程过程调用(RPC)协议。
- JSON-RPC协议中的客户端一般是为了向远程服务器请求执行某个方法/函数。
- 客户端向实现了JSON-RPC协议的服务端发送请求,多个输入参数能够通过数组或者对象传递到远程方法,这个远程方法也能返回多个输出数据,具体是什么,当然要看具体的方法实现。因为RPC可以通俗理解为:
- 客户端请求服务端完成某一个服务行为,所以RPC规范要求: 客户端发送的所有请求都是POST请求!!!
- 所有的传输数据都是单个对象,用JSON格式进行序列化。
2.2 请求响应格式
2.2.1 请求要求包含三个特定属性:
- jsonrpc: 用来声明JSON-RPC协议的版本,现在基本固定为“2.0”
- method,方法,是等待调用的远程方法名,字符串类型
- params,参数,对象类型或者是数组,向远程方法传递的多个参数值
- id,任意类型值,用于和最后的响应进行匹配,也就是这里设定多少,后面响应里这个值也设定为相同的
- 响应的接收者必须能够给出所有请求以正确的响应。这个值一般不能为Null,且为数字时不能有小数。
2.2.2 响应三个属性:
- jsonrpc, 用来声明JSON-RPC协议的版本,现在基本固定为“2.0”
- result,结果,是方法的返回值,调用方法出现错误时,必须不包含该成员。
- error,错误,当出现错误时,返回一个特定的错误编码,如果没有错误产生,必须不包含该成员。
- id,就是请求带的那个id值,必须与请求对象中的id成员的值相同。请求对象中的id时发生错误(如:转换错误或无效的请求),它必须为Null.
- 当然,有一些场景下,是不用返回值的,比如只对客户端进行通知,由于不用对请求的id进行匹配,所以这个id就是不必要的,置空或者直接不要了。
3. 使用
3.1 安装
pip3 install Flask-JSONRPC==0.3.1 -i https://pypi.douban.com/simple/
4. 基础使用
4.1 view
from flask import Flask
# 导入模块
from flask_jsonrpc import JSONRPC
app = Flask(__name__)
# 初始化jsonrpc模块--->路由前缀
jsonrpc = JSONRPC(service_url='/api')
# 普通函数
@app.route('/index')
def index():
return 'hello word'
# RPC接口规范函数 name="Home.home"---> 函数路由
@jsonrpc.method(name="Home.home")
def home():
return {
"errno": 200,
"errmsg": "ok",
"data": "hello world!"
}
if __name__ == '__main__':
# 初始化json-rpc
app.jsonrpc = jsonrpc
jsonrpc.init_app(app)
app.run()
4.2 请求格式
# 请求格式
# 访问路由post http://127.0.0.1:5000/api
# 请求体
"""
{
"jsonrpc": "2.0",
"method": "Home.home",
"id": "1"
}
"""
4.3 响应格式
# 响应数据
"""
{
"id": "1",
"jsonrpc": "2.0",
"result": {
"data": "hello world!",
"errmsg": "ok",
"errno": 200
}
}
"""
4.4 请求响应案例
4.5 提供的接口文档
# 格式
http://服务器地址:端口/api/browse/
# 案例
http://127.0.0.1:5000/api/browse/
4.6 官方文档
4.6.1 git地址:
4.6.2 中文文档:
(译) JSON-RPC 2.0 规范(中文版) - wiki . leozvchttp://wiki.geekdream.com/Specification/json-rpc_2.0.html