Skip to main content

Pure Python 3 JSON-RPC 2.0 transport realisation

Project description

Build Status Coverage Status Version Downloads Download format License

Pure Python 3 JSON-RPC 2.0 transport specification implementation. Supports python3.2+. Fork of json-rpc.

Documentation: http://json-rpc-3.readthedocs.org

This implementation does not have any transport functionality realization, only protocol. Any client or server realization is easy based on current code, but requires transport libraries, such as requests, gevent or zmq, see examples.

Install

pip install json-rpc-3

Tests

nosetests

Quickstart

Server (uses Werkzeug)

from datetime import datetime

from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple

from jsonrpc import JSONRPCResponseManager, dispatcher


manager = JSONRPCResponseManager()


def dict_to_list(dictionary):
    return list(dictionary.items())


@dispatcher.add_method
def simple_add(first=0, **kwargs):
    return first + kwargs["second"]


def echo_with_long_name(msg):
    return msg


def time_ping():
    return datetime.now().isoformat()


dispatcher.add_method(time_ping)
dispatcher.add_method(echo_with_long_name, name='echo')

dispatcher['subtract'] = lambda a, b: a - b
dispatcher['dict_to_list'] = dict_to_list


@Request.application
def application(request):
    response = manager.handle(request.get_data(cache=False, as_text=True), dispatcher)
    return Response(response.json, mimetype='application/json')


if __name__ == '__main__':
    run_simple('localhost', 4000, application)

Client (uses requests)

import json

import requests


url = "http://localhost:4000/jsonrpc"
headers = {'content-type': 'application/json'}


def print_result(payload):
    response = requests.post(
        url,
        data=json.dumps(payload),
        headers=headers
    ).json()

    print(
        r"""
        {0}
        {1}
        """.format(payload, response))


def main():
    payloads = [
        {
            "method": "simple_add",
            "params": {"first": 17, "second": 39},
            "jsonrpc": "2.0",
            "id": 0,
        },
        {
            "method": "echo",
            "params": ["Hello!"],
            "jsonrpc": "2.0",
            "id": 1
        },
        {
            "method": "time_ping",
            "jsonrpc": "2.0",
            "id": 2
        },
        {
            "method": "dict_to_list",
            "jsonrpc": "2.0",
            "params": [{1: 3, 'two': 'string', 3: [5, 'list', {'c': 0.3}]}],
            "id": 3
        },
        # Exception!
        {
            "method": "subtract",
            "jsonrpc": "2.0",
            "params": [1, 2, 3],
            "id": 2
        }
    ]
    for payload in payloads:
        print_result(payload)


if __name__ == "__main__":
    main()

Competitors

There are several libraries implementing JSON-RPC protocol. List below represents python libraries, none of the supports python3. tinyrpc looks better than others.

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

json-rpc-3-1.7.1.tar.gz (15.4 kB view hashes)

Uploaded source

Built Distribution

json_rpc_3-1.7.1-py3-none-any.whl (20.2 kB view hashes)

Uploaded 3 4

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page