Skip to main content

A flexible Python implementation of the JSON-RPC 2.0 protocol.

Project description

pyjsonrpc2

PyPI PyPI - Python Version GitHub PRs Welcome

A flexible Python implementation of the JSON-RPC 2.0 protocol (currently server-side only).

Key features

  • Full compliance with the JSON-RPC 2.0 specification
  • Multiple method registration patterns (class-based, individual methods, lambda, etc.)
  • Automatic & custom error handling capabilities
  • Support for both string and bytes input
  • Type-safe implementation
  • Extensive unit tests
  • Semantic versioning adherence

Installation

To install the package, use pip:

pip install pyjsonrpc2

Usage

For more info, check the /examples directory.

Basic Server Creation

from pyjsonrpc2.server import JsonRpcServer, rpc_method, JsonRpcError

# Create a basic server
server = JsonRpcServer()

Method Registration Patterns

These are the main patterns for registering RPC methods. /examples/registering_methods.py contains a few more.

  1. Class-based approach with decorators:
class MathServer(JsonRpcServer):
    @rpc_method
    def square(self, x):
        return x**2

    @rpc_method(name="cube")
    def calculate_cube(self, x):
        return x**3

server = MathServer()
  1. Adding individual methods using decorators:
@server.add_method
def add(a, b):
    return a + b
  1. Adding methods with custom names:
def sub(a, b):
    return a - b

server.add_method(sub, name="substract")
  1. Adding lambda functions:
server.add_method(lambda a, b: a % b, name="modulo")

Error Handling

Error handling features:

  • Custom error codes for implementation-defined & application-defined errors through the JsonRpcError class
  • Automatic conversion of Python exceptions to JSON-RPC Internal error responses
  • Support for additional error data in a structured format
  • Built-in handling of protocol-level errors (invalid JSON, missing required fields, etc.)
  • Error logging for debugging purposes
  1. Custom Implementation-Defined Errors:
class AdvancedMathServer(JsonRpcServer):
    @rpc_method
    def divide(self, a, b):
        if b == 0:
            raise JsonRpcError(
                code=-32000,
                message="Division by zero",
                data={"numerator": a, "denominator": b}
            )
        return a / b
  1. Multiple Error Conditions:
@rpc_method
def factorial(self, n):
    if not isinstance(n, int):
        # Regular exceptions are caught and converted to Internal error responses
        raise TypeError("n must be an integer")

    if n < 0:
        # Custom JSON-RPC errors with additional data
        raise JsonRpcError(
            code=-32001,
            message="Invalid input for factorial",
            data={"input": n, "reason": "Must be non-negative"}
        )
    # ... implementation ...

Request execution

result = server.call('{"jsonrpc": "2.0", "method": "add", "params": [5, 3], "id": 1}')
result = server.call(b'{"jsonrpc": "2.0", "method": "subtract", "params": [5, 3], "id": 2}')

Tests

The simplest way to run tests is:

python -m unittest

As a more robust alternative, you can install tox to automatically test across the supported python versions, then run:

tox -p

Issue tracker

Please report any bugs or enhancement ideas using the issue tracker.

License

pyjsonrpc2 is licensed under the terms of the MIT License.

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

pyjsonrpc2-1.0.0.tar.gz (14.6 kB view details)

Uploaded Source

Built Distribution

pyjsonrpc2-1.0.0-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file pyjsonrpc2-1.0.0.tar.gz.

File metadata

  • Download URL: pyjsonrpc2-1.0.0.tar.gz
  • Upload date:
  • Size: 14.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.1

File hashes

Hashes for pyjsonrpc2-1.0.0.tar.gz
Algorithm Hash digest
SHA256 b13f4262b6a198b5ec30b643e42b0e9645e9d17b775f21e50e98fbeda058c608
MD5 74b3893ea33cfe87324da41c93747418
BLAKE2b-256 211da706a9a7db0c4dfccd74eb4c2c272c1860c5dba2438782167086e1402bfe

See more details on using hashes here.

File details

Details for the file pyjsonrpc2-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pyjsonrpc2-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f378e0b97e5cf8717384b6a7e0b86ceb91d85e9091a3ead49a5bb39ebd94d1a8
MD5 0cc0a06af8c9b2f9e5f485da462f5d5d
BLAKE2b-256 aea39db884d6137753fd21e7a1adbf9d1e55acb8057297e080e6bf33bdb45671

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