Skip to main content

WSGI Framework for JSON RPC 2.0

Project description

jsonrpc2 is WSGI Framework for JSON RPC 2.0. JSON RPC 2.0 Spec can be seen on http://groups.google.com/group/json-rpc/web/json-rpc-2-0

QuickStart

install via pip:

$ pip install jsonrpc2

or install via easy_install:

$ easy_install jsonrpc2

write your procedures in hello.py:

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

run jsonrpc2 server:

$ runjsonrpc2 hello

Integration with Paste Script

create project with paste script template:

$ paster create -t paster_jsonrpc2 myrpc
$ cd myrpc

run server

$ paster serve run.ini

access http://localhost:8080/

Internal

>>> import simplejson as json
>>> from jsonrpc2 import JsonRpcApplication

sample procedure:

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

create rpc application:

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

set up for test:

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

call procedure:

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

got results:

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

lazy loading:

>>> 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
{'jsonrpc': '2.0', 'id': 'sample.add', 'result': 3}

JSON-RPC2 Example

use raw rpc processor:

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

sample procedures:

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

register procedures with dict interface:

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

Procedure Call with positional parameters:

>>> 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}

Procedure Call with named parameters:

>>> 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}

Notification:

>>> rpc({"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]})
>>> rpc({"jsonrpc": "2.0", "method": "foobar"})
Procedure Call of non-existent procedure::
>>> del rpc['foobar']
>>> rpc({"jsonrpc": "2.0", "method": "foobar", "id": "1"})
{'jsonrpc': '2.0', 'id': '1', 'error': {'message': 'Method Not Found', 'code': -32601}}

Procedure Call with invalid 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}}

Batched Call:

>>> 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]}]

ChangeLog

0.3

  • fix bugs

  • Paste Scripte templates

  • runjsonrpc2 command

0.3.1

  • fix bugs (content-type with charset)

0.2

  • remove dependency to WebOb

  • split procedure call class from web application class

0.2.1

  • lazy loading from method name.

0.2.2

  • add dict interface.

0.2.3

  • fix: read body with CONTENT_LENGTH.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jsonrpc2-0.3.1.tar.gz (13.4 kB view details)

Uploaded Source

File details

Details for the file jsonrpc2-0.3.1.tar.gz.

File metadata

  • Download URL: jsonrpc2-0.3.1.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for jsonrpc2-0.3.1.tar.gz
Algorithm Hash digest
SHA256 daa5fe4d8922c9b68ff1215ba1a14d51c6563dd973dacf68bfaa15b1dcb32c17
MD5 e98266099f092f512c406c06268e0cf8
BLAKE2b-256 2601237c8e8820d679ae063570f6fda8bfc16e7af42f918844242dca7f65fda1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page