← Назад к вопросам

Что такое JRPC?

1.0 Junior🔥 131 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое JSON-RPC (JRPC)?

JSON-RPC (JSON Remote Procedure Call) — это легковесный протокол для удаленного вызова процедур (RPC), использующий JSON (JavaScript Object Notation) в качестве формата данных для кодирования запросов и ответов. Он предназначен для простой и эффективной коммуникации между клиентом и сервером в распределенных системах, чаще всего по протоколу HTTP, но может работать и поверх других транспортных слоев (WebSocket, TCP).

Основная цель JSON-RPC — предоставить минималистичный, но гибкий механизм для вызова методов на удаленном сервере, передачи параметров и получения результата. В отличие от более тяжеловесных протоколов (например, SOAP или gRPC), JRPC фокусируется на простоте и удобочитаемости данных.

Ключевые характеристики протокола

  • Текстовый формат на основе JSON: Читаем для человека и легко парсится большинством языков программирования.
  • Независимость от транспорта: Может работать поверх HTTP, WebSocket, TCP и даже через файлы или очереди сообщений.
  • Уведомления (Notifications): Поддерживает однонаправленные запросы без ожидания ответа.
  • Пакетные запросы (Batch): Позволяет отправлять несколько вызовов в одном запросе и получать массив ответов.
  • Независимость от языка: Клиент и сервер могут быть реализованы на любых языках, поддерживающих JSON.

Структура JSON-RPC сообщений

Каждое сообщение — это JSON-объект с определенными полями. Существует два типа сообщений: запрос (Request) и ответ (Response/Error).

Пример запроса (Request)

{
    "jsonrpc": "2.0",
    "method": "calculateSum",
    "params": [5, 10],
    "id": 1
}
  • jsonrpc (обязательное): Версия протокола. Актуальная версия — "2.0".
  • method (обязательное): Строка с именем вызываемого метода на сервере.
  • params (опциональное): Массив или объект с параметрами для метода. Может отсутствовать, если параметры не нужны.
  • id (опциональное): Идентификатор запроса (строка, число или null). Если id присутствует — это вызов, требующий ответа. Если id равен null — это уведомление (notification), на которое сервер не должен отвечать.

Пример успешного ответа (Success Response)

{
    "jsonrpc": "2.0",
    "result": 15,
    "id": 1
}
  • jsonrpc: Версия протокола.
  • result (обязательное при успехе): Данные, возвращаемые вызванным методом. Могут быть любого типа JSON.
  • id: Должен в точности совпадать с id из запроса.

Пример ответа с ошибкой (Error Response)

{
    "jsonrpc": "2.0",
    "error": {
        "code": -32601,
        "message": "Method not found",
        "data": "The method 'calculateMultiply' does not exist."
    },
    "id": 1
}
  • error (обязательное при ошибке): Объект с деталями ошибки.
    *   **`code`**: Целочисленный код ошибки. Существуют стандартные коды (например, -32601 — метод не найден, -32700 — ошибка парсинга JSON).
    *   **`message`**: Краткое описание ошибки.
    *   **`data`** (опциональное): Дополнительная информация об ошибке.

Пример взаимодействия (клиент-сервер) на Python

Рассмотрим простейшую реализацию клиента и сервера с использованием HTTP.

Серверная часть (используем библиотеку json-rpc)

from werkzeug.wrappers import Request, Response
from jsonrpc import JSONRPCResponseManager, dispatcher

# Регистрируем метод, который будет доступен для удаленного вызова
@dispatcher.add_method
def calculateSum(a, b):
    return a + b

@Request.application
def application(request):
    # Диспетчер обрабатывает входящий JSON и вызывает соответствующий метод
    response = JSONRPCResponseManager.handle(request.data, dispatcher)
    return Response(response.json, mimetype='application/json')

if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, application)

Клиентская часть

import requests
import json

url = "http://localhost:4000"

# Подготовка запроса
payload = {
    "jsonrpc": "2.0",
    "method": "calculateSum",
    "params": [5, 10],
    "id": 1
}

headers = {'content-type': 'application/json'}

# Отправка POST-запроса
response = requests.post(url, data=json.dumps(payload), headers=headers).json()

# Обработка ответа
if 'result' in response:
    print(f"Результат: {response['result']}")  # Выведет: Результат: 15
else:
    print(f"Ошибка: {response['error']}")

Преимущества и недостатки JSON-RPC

Преимущества:

  • Простота: Легко понять и реализовать.
  • Читаемость: JSON удобно читать и отлаживать.
  • Гибкость: Поддержка уведомлений и пакетных запросов.
  • Широкая поддержка: Реализации доступны для всех популярных языков.

Недостатки:

  • Отсутствие строгой типизации: По сравнению с gRPC (Protocol Buffers) или GraphQL (сильная типизация схемы).
  • Меньшая производительность: Текстовый JSON менее эффективен по сравнению с бинарными протоколами (например, gRPC или MessagePack).
  • Нет встроенных механизмов для описания API (контрактов), как в OpenAPI/Swagger для REST. Для документирования JSON-RPC API часто используют ad-hoc методы.

Сравнение с другими технологиями

  • REST vs JSON-RPC: REST — это архитектурный стиль, оперирующий ресурсами (сущностями) и HTTP-методами. JSON-RPC — это протокол, сфокусированный на действиях (вызове методов). Выбор зависит от модели предметной области: если система построена вокруг команд/действий — JSON-RPC может быть более естественным.
  • gRPC vs JSON-RPC: gRPC — это современный высокопроизводительный RPC-фреймворк от Google, использующий бинарные Protocol Buffers для сериализации и HTTP/2 для транспорта. Он строго типизирован и генерирует код клиента/сервера. JSON-RPC проще, но менее производителен и типобезопасен.

Роль в контексте QA Automation

Понимание JSON-RPC критично для тестирования API микросервисов, блокчейн-нод (например, Ethereum использует JSON-RPC), внутренних сервисов и других распределенных систем. Автоматизатору необходимо:

  1. Уметь формировать корректные JSON-RPC запросы.
  2. Валидировать структуру и содержимое ответов (успешных и ошибочных).
  3. Тестировать edge-кейсы: уведомления, пакетные запросы, невалидный JSON, несуществующие методы.
  4. Интегрировать вызовы JSON-RPC в тестовые фреймворки (например, на базе pytest или TestNG).
  5. Использовать инструменты вроде Postman (поддерживает JSON-RPC через Raw body) или писать специализированные клиенты на языке автоматизации.

Таким образом, JSON-RPC — это важный инструмент в арсенале QA Automation инженера, работающего со сложными backend-системами, где требуется эффективная и простая межпроцессная коммуникация. Его знание позволяет создавать надежные и полные автоматизированные тесты для API, построенных на этом протоколе.

Что такое JRPC? | PrepBro