This commit is contained in:
2025-09-03 17:39:24 +03:00
parent d761858482
commit e336a9d452
5 changed files with 34 additions and 40 deletions

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "jsonrpc" name = "jsonrpc"
version = "2.0" version = "3.0"
authors = [ authors = [
{ name="RemiZOffAlex", email="remizoffalex@gmail.com" }, { name="RemiZOffAlex", email="remizoffalex@gmail.com" },
] ]

View File

@@ -11,20 +11,6 @@ from .exceptions import *
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Response:
def __init__(self, id: int, result):
self.id = id
self.result = result
def __json__(self):
response = {
"jsonrpc": "3.0",
"result": self.result,
"id": self.id,
}
return response
class Method: class Method:
def __init__(self, function, middlewares=None, debug: bool = False): def __init__(self, function, middlewares=None, debug: bool = False):
self.function = function self.function = function
@@ -71,11 +57,6 @@ class Method:
return '<{}>'.format(self.function) return '<{}>'.format(self.function)
class Wrapper:
def __init__(self, func):
self.func = func
class JSONRPC: class JSONRPC:
"""Основной класс JSON-RPC """Основной класс JSON-RPC
""" """
@@ -177,8 +158,6 @@ class JSONRPC:
response = method(query) response = method(query)
except JSONRPCError as e: except JSONRPCError as e:
log.error(traceback.format_exc()) log.error(traceback.format_exc())
# print(traceback.format_exc())
# response = traceback.format_exc()
response = InternalError( response = InternalError(
id=query['id'], id=query['id'],
message=str(e) message=str(e)
@@ -192,10 +171,11 @@ class JSONRPC:
# message=traceback.format_exc() # message=traceback.format_exc()
) )
else: else:
response = Response( response = {
id=query['id'], "jsonrpc": query['jsonrpc'],
result=response "id": query['id'],
) "result": response
}
result = response result = response
return result return result

View File

@@ -6,10 +6,11 @@ import logging
import pathlib import pathlib
import aiohttp_jinja2 import aiohttp_jinja2
from aiohttp.web import Response, json_response from aiohttp.web import Response
from .. import JSONRPC from .. import JSONRPC
from ..exceptions import ParseError from ..exceptions import ParseError
from ..serialize import JSONRPCEncoder
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@@ -39,7 +40,13 @@ class APIHandler:
try: try:
json_data = await request.json() json_data = await request.json()
result = self.jsonrpc(json_data) result = self.jsonrpc(json_data)
return json_response(result) body = json.dumps(result, cls=JSONRPCEncoder)
response = Response(
text=body,
status=200,
content_type='application/json'
)
return response
except ValueError as e: except ValueError as e:
log.error('invalid json: %s', request_data) log.error('invalid json: %s', request_data)
log.exception(e) log.exception(e)

View File

@@ -16,22 +16,21 @@ class Client:
debug: bool = False debug: bool = False
): ):
self.url = url self.url = url
self.headers = {'content-type': 'application/json'}
self.debug = debug self.debug = debug
def __call__(self, queries): def __call__(self, queries):
"""Вызов метода """Вызов метода
""" """
if isinstance(queries, str): if isinstance(queries, str):
payload = queries
elif isinstance(queries, dict | list):
payload = json.dumps(queries) payload = json.dumps(queries)
elif isinstance(queries, dict | list):
payload = queries
response = requests.post( response = requests.post(
self.url, self.url,
data=payload, json=payload
headers=self.headers
) )
if self.debug: if self.debug:
log.debug('status_code', response.status_code)
log.debug('content', response.content) log.debug('content', response.content)
result = response.json() result = response.json()

View File

@@ -2,6 +2,7 @@ __author__ = 'RemiZOffAlex'
__email__ = 'remizoffalex@mail.ru' __email__ = 'remizoffalex@mail.ru'
import unittest import unittest
from uuid import uuid4
from jsonrpc import JSONRPC from jsonrpc import JSONRPC
@@ -19,29 +20,36 @@ class Calc(unittest.TestCase):
def test_example(self): def test_example(self):
self.assertEqual( self.assertEqual(
jsonrpc.example('boo'), jsonrpc.example('boo'),
{'jsonrpc': '2.0', 'method': 'boo', 'id': 1} {
'jsonrpc': '3.0',
'method': 'boo',
'id': '00000000-0000-0000-0000-000000000000'
}
) )
def test_evaluate(self): def test_evaluate(self):
request = {'jsonrpc': '2.0', 'method': 'boo', 'id': 1} id = str(uuid4())
request = {'jsonrpc': '3.0', 'method': 'boo', 'id': id}
response = jsonrpc(request) response = jsonrpc(request)
self.assertEqual( self.assertEqual(
response, response,
{'jsonrpc': '2.0', 'result': 'Welcome to JSON-RPC', 'id': 1} {'jsonrpc': '3.0', 'result': 'Welcome to JSON-RPC', 'id': id}
) )
def test_error(self): def test_error(self):
request = {'jsonrpc': '2.0', 'method': 'bla-bla', 'id': 1} id = str(uuid4())
request = {'jsonrpc': '3.0', 'method': 'bla-bla', 'id': id}
response = jsonrpc(request) response = jsonrpc(request)
print('test_error.response', response)
print(response) print(response)
self.assertEqual( self.assertEqual(
response, response,
{ {
'jsonrpc': '2.0', 'jsonrpc': '3.0',
'error': { 'error': {
'code': -32601, 'code': 'internal.error',
'message': 'Метод не найден: bla-bla' 'message': 'Метод не найден: bla-bla'
}, },
'id': 1 'id': id
} }
) )