跳转到主要内容

JSON RPC 2.0的WSGI框架

项目描述

https://drone.io/bitbucket.org/aodag/jsonrpc2/status.png

jsonrpc2是JSON RPC 2.0的WSGI框架。

JSON RPC 2.0规范可以在http://www.jsonrpc.org/specification 上查看。

快速入门

通过pip安装

$ pip install jsonrpc2

在hello.py中编写你的过程

def greeting(name):
    return dict(message="Hello, %s!" % name)

运行jsonrpc2服务器

$ runjsonrpc2 hello

与Paste Script集成

使用paste script模板创建项目

$ paster create -t paster_jsonrpc2 myrpc
$ cd myrpc

运行服务器

$ paster serve run.ini

访问 http://localhost:8080/

内部

>>> import json
>>> from jsonrpc2 import JsonRpcApplication

示例过程

>>> def greeting(name="world"):
...     return "Hello, %s!" % name

创建rpc应用程序

>>> app = JsonRpcApplication(rpcs=dict(greeting=greeting))

设置测试

>>> from webtest import TestApp
>>> testapp = TestApp(app)

调用过程

>>> call_values = {'jsonrpc':'2.0', 'method':'greeting', 'id':'greeting'}
>>> res = testapp.post('/', params=json.dumps(call_values), content_type="application/json")

获取结果

>>> res.json
{u'jsonrpc': u'2.0', u'id': u'greeting', u'result': u'Hello, world!'}

延迟加载

>>> app.rpc.methods['sample.add'] = 'tests.sample:add'
>>> call_values = {'jsonrpc':'2.0', 'method':'sample.add', 'id':'sample.add', 'params':[1, 2]}
>>> res = testapp.post('/', params=json.dumps(call_values), content_type="application/json")
>>> res.json
{u'jsonrpc': u'2.0', u'id': u'sample.add', u'result': 3}

extra vars

>>> from jsonrpc2 import JsonRpc
>>> rpc = JsonRpc()
>>> rpc['add'] = lambda a, b: a + b
>>> rpc({'jsonrpc': '2.0', 'method': 'add', 'id': 'rpc-1', 'params': {'a': 2}}, b=3)
{'jsonrpc': '2.0', 'id': 'rpc-1', 'result': 5}

处理错误

>>> from jsonrpc2 import JsonRpc
>>> class MyException(Exception):
...     pass
>>> def my_rpc():
...     raise MyException()
>>> rpc = JsonRpc({'call': my_rpc}, {MyException: -32001})
>>> rpc({'jsonrpc': '2.0', 'method': 'call', 'id': 'rpc-1', 'params': []})
{'jsonrpc': '2.0', 'id': 'rpc-1', 'error': {'message': '', 'code': -32001, 'data': '[]'}}

JSON-RPC2 示例

使用原始rpc处理器

>>> from jsonrpc2 import JsonRpc
>>> rpc = JsonRpc()

示例过程

>>> def subtract(minuend, subtrahend):
...     return minuend - subtrahend
>>> def update(*args):
...     pass
>>> def foobar():
...     pass

使用字典接口注册过程

>>> rpc['subtract'] = subtract
>>> rpc['update'] = update
>>> rpc['foobar'] = foobar

按位置参数调用过程

>>> rpc({"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1})
{'jsonrpc': '2.0', 'id': 1, 'result': 19}

>>> rpc({"jsonrpc": "2.0", "method": "subtract", "params": [23, 42], "id": 2})
{'jsonrpc': '2.0', 'id': 2, 'result': -19}

按名称参数调用过程

>>> rpc({"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3})
{'jsonrpc': '2.0', 'id': 3, 'result': 19}

>>> rpc({"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4})
{'jsonrpc': '2.0', 'id': 4, 'result': 19}

通知

>>> rpc({"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]})
>>> rpc({"jsonrpc": "2.0", "method": "foobar"})

调用不存在的过程

>>> del rpc['foobar']
>>> rpc({"jsonrpc": "2.0", "method": "foobar", "id": "1"})
{'jsonrpc': '2.0', 'id': '1', 'error': {'message': 'Method Not Found', 'code': -32601}}

调用无效的JSON-RPC

>>> rpc([1,2,3])
{'jsonrpc': '2.0', 'id': None, 'error': {'message': 'Invalid Request', 'code': -32600}}

>>> rpc({"jsonrpc": "2.0", "method": 1, "params": "bar"})
{'jsonrpc': '2.0', 'id': None, 'error': {'message': 'Invalid Request', 'code': -32600}}

批量调用

>>> rpc['sum'] = lambda *args: reduce(lambda a, b: a + b, args)
>>> def get_data():
...     return ["hello", 5]
>>> rpc['get_data'] = get_data
>>> result = 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"} ])
>>> from pprint import pprint
>>> pprint(result)
[{'id': '1', 'jsonrpc': '2.0', 'result': 7},
 {'error': {'code': -32601, 'message': 'Method Not Found'},
  'id': None,
  'jsonrpc': '2.0'},
 {'id': '2', 'jsonrpc': '2.0', 'result': 19},
 {'error': {'code': -32600, 'message': 'Invalid Request'},
  'id': None,
  'jsonrpc': '2.0'},
 {'error': {'code': -32601, 'message': 'Method Not Found'},
  'id': '5',
  'jsonrpc': '2.0'},
 {'id': '9', 'jsonrpc': '2.0', 'result': ['hello', 5]}]

变更日志

0.4.1

  • 0.4是棕色袋发布。

0.4

特性

  • 添加了对py3的支持

  • 添加了注册应用程序错误

修复了错误

  • 不要为服务器异常引发内部错误 #13

  • 内容类型不正确 #15

  • 内部日志配置损坏 #16

0.3

  • 修复错误

  • 粘贴脚本模板

  • 运行jsonrpc2命令

0.3.1

  • 修复错误(带有charset的内容类型)

0.3.2

  • 能够将额外变量传递给过程

0.2

  • 移除对WebOb的依赖

  • 将过程调用类从Web应用程序类中分离出来

0.2.1

  • 从方法名进行延迟加载。

0.2.2

  • 添加字典接口。

0.2.3

  • 修复:使用CONTENT_LENGTH读取正文。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

jsonrpc2-0.4.1.tar.gz (15.2 kB 查看哈希)

上传时间

构建分发

jsonrpc2-0.4.1-py2.py3-none-any.whl (20.2 kB 查看哈希)

上传时间 Python 2 Python 3

由以下机构支持