Документация протокола A2A›API Технологии›Что такое JSON-RPC 2.0: Полное руководство

Что такое JSON-RPC 2.0: Полное руководство

4/17/2025

Подробное объяснение протокола JSON-RPC 2.0, его реализации и лучших практик

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

Что такое JSON-RPC 2.0?

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

Протокол позволяет распределенным системам эффективно обмениваться данными, предоставляя стандартизированный способ для приложений вызывать методы или процедуры на удаленных системах и получать ответы. В отличие от других протоколов веб-сервисов, которые могут быть сложными и тяжелыми, JSON-RPC фокусируется на простоте, сохраняя функциональность.

Основные концепции JSON-RPC 2.0

Модель запрос-ответ

JSON-RPC 2.0 работает по простой модели запрос-ответ. Клиент отправляет запрос на сервер, сервер обрабатывает его и возвращает ответ. Протокол может обрабатывать как одиночные запросы, так и пакетные запросы, позволяя обрабатывать несколько вызовов в одной HTTP-транзакции.

Безсостояний дизайн

Протокол по своей сути безсостояний, что означает, что каждый цикл запрос-ответ независим и не зависит от предыдущих взаимодействий. Это упрощает реализацию и повышает масштабируемость в распределенных системах.

Транспортная агностичность

Одной из ключевых сильных сторон JSON-RPC 2.0 является его транспортная агностичность. Он может использоваться через различные транспортные протоколы, такие как HTTP, WebSockets, TCP или даже Unix-сокеты. Эта гибкость позволяет разработчикам выбирать наиболее подходящий транспортный механизм для своего конкретного случая использования.

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

Формат запроса

Запрос JSON-RPC 2.0 состоит из следующих элементов:

  • jsonrpc: Должен быть точно "2.0", указывая версию протокола
  • method: Строка, содержащая имя вызываемого метода
  • params: Необязательное структурированное значение (объект или массив), содержащее значения параметров
  • id: Уникальный идентификатор, установленный клиентом, который может быть строкой, числом или null

Вот пример типичного запроса JSON-RPC 2.0:

json
{
    "jsonrpc": "2.0",
    "method": "subtract",
    "params": [42, 23],
    "id": 1
}

Формат ответа

Ответ JSON-RPC 2.0 включает:

  • jsonrpc: Должен быть точно "2.0"
  • result: Данные, возвращаемые методом (включаются только в случае успешного вызова)
  • error: Объект ошибки (включается только при возникновении ошибки во время обработки)
  • id: Тот же id, что и в запросе, на который отвечает

Пример успешного ответа:

json
{
    "jsonrpc": "2.0",
    "result": 19,
    "id": 1
}

Пример ответа с ошибкой:

json
{
    "jsonrpc": "2.0",
    "error": {
        "code": -32601,
        "message": "Method not found"
    },
    "id": 1
}

Уведомления

JSON-RPC 2.0 также поддерживает уведомления - запросы без поля id. Это специальные запросы, где клиент не ожидает ответа:

json
{
    "jsonrpc": "2.0",
    "method": "update",
    "params": [1, 2, 3, 4, 5]
}

Обработка ошибок в JSON-RPC 2.0

Протокол определяет несколько стандартных кодов ошибок:

  • -32700: Ошибка парсинга (неверный JSON)
  • -32600: Недопустимый запрос
  • -32601: Метод не найден
  • -32602: Недопустимые параметры
  • -32603: Внутренняя ошибка
  • -32000 до -32099: Ошибка сервера (зарезервировано для ошибок сервера, определяемых реализацией)

Реализация JSON-RPC 2.0 с помощью Python

Python предлагает несколько библиотек для реализации серверов и клиентов JSON-RPC 2.0. Давайте рассмотрим простую реализацию с использованием пакетов jsonrpcserver и jsonrpcclient.

Реализация сервера

Сначала создадим базовый сервер JSON-RPC 2.0:

python
from jsonrpcserver import method, serve, Success

@method
def subtract(minuend, subtrahend):
    return Success(minuend - subtrahend)

@method
def add(a, b):
    return Success(a + b)

@method
def get_data():
    return Success(["hello", 5])

if __name__ == "__main__":
    serve(port=5000)

Реализация клиента

Теперь реализуем клиент для связи с нашим сервером:

python
from jsonrpcclient import request, parse
import requests

def make_request(method, params=None):
    response = requests.post(
        "http://localhost:5000",
        json=request(method, params),
        headers={"Content-Type": "application/json"},
    )
    return parse(response.json())

# Примеры одиночных запросов
result = make_request("subtract", [42, 23])
print(f"subtract result: {result}")

result = make_request("add", [10, 20])
print(f"add result: {result}")

result = make_request("get_data")
print(f"get_data result: {result}")

Пакетные запросы

JSON-RPC 2.0 также поддерживает пакетные запросы, позволяя отправлять несколько вызовов в одном запросе:

python
from jsonrpcclient import request_batch, parse_batch
import requests

batch = request_batch(
    ("subtract", [42, 23]),
    ("add", [10, 20]),
    ("get_data", None)
)

response = requests.post(
    "http://localhost:5000",
    json=batch,
    headers={"Content-Type": "application/json"},
)

results = parse_batch(response.json())
for result in results:
    print(f"Result: {result}")

Преимущества JSON-RPC 2.0

Простота

Протокол намеренно прост, что делает его легким для понимания, реализации и использования. Эта простота снижает кривую обучения для разработчиков и минимизирует потенциальные ошибки в реализации.

Легковесность

JSON-RPC 2.0 легче по сравнению с другими RPC-протоколами, такими как SOAP. Формат JSON обеспечивает хороший баланс между читаемостью человеком и эффективностью машинного анализа.

Языковая агностичность

Поскольку JSON широко поддерживается во всех языках программирования, JSON-RPC 2.0 может быть реализован практически на любом языке, обеспечивая межъязыковую коммуникацию.

Пакетная обработка

Возможность отправлять несколько запросов в одной HTTP-транзакции снижает сетевые накладные расходы и повышает производительность для приложений, которым необходимо выполнять несколько удаленных вызовов процедур.

JSON-RPC 2.0 vs. REST vs. GraphQL

По сравнению с REST

  • JSON-RPC ориентирован на действия (методы), в то время как REST ориентирован на ресурсы
  • JSON-RPC в основном использует POST-запросы, в то время как REST использует различные HTTP-методы
  • JSON-RPC может быть более простым для API, ориентированных на действия
  • REST имеет лучшие возможности кэширования через HTTP

По сравнению с GraphQL

  • JSON-RPC проще в реализации и понимании
  • GraphQL предлагает более гибкие возможности запросов
  • JSON-RPC лучше подходит для операций, ориентированных на процедуры
  • GraphQL превосходит в извлечении сложных, взаимосвязанных данных с минимальными накладными расходами

Лучшие практики для JSON-RPC 2.0

Соображения безопасности

  • Всегда проверяйте входные параметры
  • Реализуйте аутентификацию и авторизацию
  • Используйте HTTPS для транспорта при использовании HTTP
  • Рассмотрите возможность ограничения скорости для предотвращения злоупотреблений

Оптимизация производительности

  • Используйте пакетные запросы, когда это уместно
  • Держите полезные нагрузки компактными
  • Рассмотрите возможность сжатия для больших ответов
  • Реализуйте механизмы кэширования, где это применимо

Документация

  • Документируйте все доступные методы
  • Четко определяйте требования к параметрам и их типы
  • Предоставляйте примеры запросов и ответов
  • Документируйте коды ошибок и их значения

Заключение

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

Хотя для конкретных случаев использования появились более новые технологии, такие как GraphQL, JSON-RPC 2.0 остается актуальным благодаря своей простой реализации и широкой применимости. Для разработчиков, стремящихся реализовать функциональность RPC без сложности более тяжелых протоколов, JSON-RPC 2.0 заслуживает серьезного рассмотрения.

Понимая возможности протокола и следуя лучшим практикам, вы можете использовать JSON-RPC 2.0 для создания надежных, эффективных и поддерживаемых распределенных систем.

T

Technical Blogger

Автор

Доступные языки: