Quire

JSON-RPC

From Quire, the open reference··4 min read

JSON-RPC (от англ. JSON Remote Procedure Call — «удалённый вызов процедур с использованием JSON») — протокол удалённого вызова процедур (RPC), в котором сообщения кодируются в формате JSON. Он определяет структуру запросов и ответов, способы передачи параметров, обработки ошибок и отправки уведомлений. Спецификация JSON-RPC не привязана к определённому транспортному протоколу: сообщения могут передаваться, в частности, через HTTP или сетевые сокеты[1].

Основными опубликованными версиями протокола являются JSON-RPC 1.0 и JSON-RPC 2.0. В версии 2.0 предусмотрены именованные параметры, уведомления без ответа и пакетная передача нескольких запросов[2][1].

История#edit

Разработка JSON-RPC началась в 2004 году как попытка использовать JSON вместо XML для удалённых вызовов процедур[3]. Первая спецификация, JSON-RPC 1.0, была опубликована в 2005 году[2].

В 2006 году появился рабочий проект JSON-RPC 1.1, предусматривавший, в частности, именованные параметры, расширенную обработку ошибок и описание доступных процедур. В дальнейшем обсуждались альтернативные проекты версии 1.1 и предложение JSON-RPC 1.2[4][5].

Спецификация JSON-RPC 2.0 была опубликована 26 марта 2010 года на основе предложения от 24 мая 2009 года. Её обновлённая редакция датирована 4 января 2013 года[1].

Принцип работы#edit

Клиент отправляет запрос с именем метода и, при необходимости, параметрами. Сервер обрабатывает запрос и возвращает результат или сообщение об ошибке. Для сопоставления запроса и ответа используется идентификатор id. Вызов без ожидания ответа называется уведомлением (англ. notification)[1].

В JSON-RPC 2.0 запрос представляет собой объект JSON со следующими полями:

  • jsonrpc — обязательная строка со значением "2.0", обозначающая версию протокола;
  • method — обязательная строка с именем вызываемого метода;
  • params — необязательный массив позиционных параметров или объект с именованными параметрами;
  • id — идентификатор запроса, используемый для сопоставления с ответом. Может быть строкой, числом или null; значение null не рекомендуется. Если поле отсутствует, сообщение считается уведомлением.

Имена методов, начинающиеся с rpc., зарезервированы для системных расширений. Имена методов и параметров чувствительны к регистру[1].

При успешном выполнении запроса ответ содержит поля jsonrpc, result и id. При ошибке вместо result возвращается объект error. В соответствии со спецификацией 2.0 поля result и error не должны одновременно присутствовать в одном ответе[1].

Версии протокола#edit

Основные различия между JSON-RPC 1.0 и JSON-RPC 2.0 приведены в таблице[2][1].

ХарактеристикаJSON-RPC 1.0JSON-RPC 2.0
Обозначение версииОтдельное поле версии отсутствуетОбязательное поле "jsonrpc": "2.0"
Параметры вызоваПоле params содержит массивНеобязательное поле params содержит массив или объект
УведомлениеПоле id имеет значение nullПоле id отсутствует
Формат ответаПрисутствуют оба поля: result и error; неиспользуемое равно nullПрисутствует только одно из полей: result или error
Пакетные запросыОтдельный формат пакетного вызова не определёнМассив запросов с возможностью обработки в произвольном порядке

Уведомления#edit

Уведомление — запрос, на который сервер не должен отвечать. В JSON-RPC 2.0 уведомлением считается объект запроса без поля id. Даже если при обработке такого сообщения возникла ошибка, ответ не отправляется. Наличие "id": null, в отличие от JSON-RPC 1.0, само по себе не обозначает уведомление[1].

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

JSON-RPC 2.0 позволяет передать несколько запросов и уведомлений в одном массиве JSON. Сервер может обрабатывать их в произвольном порядке, в том числе параллельно. Ответы возвращаются массивом, причём их порядок не обязательно совпадает с порядком запросов: для сопоставления используется id. На уведомления ответы не включаются. Пустой массив не считается допустимым пакетом; если пакет состоит только из уведомлений, сервер не возвращает ответ[1].

Обработка ошибок#edit

При ошибке сервер возвращает объект error, содержащий целочисленный код code, строковое описание message и необязательное поле data с дополнительными сведениями. Спецификация JSON-RPC 2.0 определяет следующие стандартные коды ошибок[1].

КодНазвание в спецификацииЗначение
-32700Parse errorПолучены данные, не являющиеся допустимым JSON
-32600Invalid RequestНекорректная структура запроса JSON-RPC
-32601Method not foundЗапрошенный метод не существует или недоступен
-32602Invalid paramsНекорректные параметры метода
-32603Internal errorВнутренняя ошибка JSON-RPC
-32099 — -32000Server errorДиапазон, зарезервированный для ошибок сервера, определяемых реализацией

Диапазон кодов от -32768 до -32000 зарезервирован спецификацией для предопределённых ошибок и возможного дальнейшего использования[1].

Примеры#edit

Запрос и ответ в JSON-RPC 1.0#edit

Вызов метода subtract для вычитания двух чисел:

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

Ответ:

{"result": 19, "error": null, "id": 1}

Запрос и ответ в JSON-RPC 2.0#edit

Тот же вызов с именованными параметрами:

{
  "jsonrpc": "2.0",
  "method": "subtract",
  "params": {"minuend": 42, "subtrahend": 23},
  "id": 1
}

Ответ сервера:

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

Уведомление#edit

Пример сообщения, не требующего ответа:

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

Ошибка#edit

Ответ на вызов несуществующего метода:

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

Пакетный вызов#edit

Пример пакета из двух запросов и одного уведомления:

[
  {"jsonrpc": "2.0", "method": "sum", "params": [1, 2], "id": 1},
  {"jsonrpc": "2.0", "method": "notify", "params": ["done"]},
  {"jsonrpc": "2.0", "method": "subtract", "params": [8, 3], "id": 2}
]

Возможный ответ, в котором порядок результатов отличается от порядка запросов:

[
  {"jsonrpc": "2.0", "result": 5, "id": 2},
  {"jsonrpc": "2.0", "result": 3, "id": 1}
]

Все приведённые примеры иллюстрируют формат сообщений; набор доступных методов определяется конкретной службой, а не самим протоколом[2][1].

Передача данных и безопасность#edit

Спецификация JSON-RPC 2.0 определяет формат сообщений независимо от транспортного механизма. В частности, JSON-RPC используется при обмене сообщениями через HTTP, WebSocket и потоки ввода-вывода. Конкретная реализация определяет способ организации соединения и разграничения сообщений в транспортном потоке[1][6].

Сам по себе JSON-RPC не предоставляет механизма аутентификации, авторизации или защиты транспортного соединения. Эти задачи должны решаться средствами используемого транспорта и приложения[7].

Применение#edit

JSON-RPC используется, в частности, в следующих технологиях:

  • Language Server Protocol (LSP) — протокол взаимодействия редакторов кода и интегрированных сред разработки с языковыми серверами, предоставляющими автодополнение, поиск определений и другие функции[8].
  • Ethereum — интерфейс JSON-RPC применяется для взаимодействия программ с узлами сети, получения данных блокчейна и отправки транзакций[9].
  • Model Context Protocol (MCP) — протокол взаимодействия приложений с инструментами и источниками данных для систем искусственного интеллекта; использует формат сообщений JSON-RPC 2.0[10].

Реализации#edit

Для JSON-RPC существуют клиентские и серверные библиотеки на разных языках программирования. В числе примеров:

  • .NET — StreamJsonRpc, библиотека для обмена сообщениями JSON-RPC 2.0 через потоки, каналы и WebSocket[11];
  • JavaScript и TypeScript — vscode-jsonrpc, библиотека, применяемая в реализации Language Server Protocol[12];
  • Python — jsonrpcserver, библиотека для обработки запросов JSON-RPC 2.0[13];
  • Rust — jsonrpsee, асинхронная клиентская и серверная библиотека с поддержкой HTTP и WebSocket[14];
  • Go — пакет стандартной библиотеки net/rpc/jsonrpc, реализующий JSON-RPC 1.0, но не 2.0[15].

См. также#edit

Примечания#edit

  1. ^ a b c d e f g h i j k l m JSON-RPC 2.0 Specification. JSON-RPC (4 января 2013). Дата обращения: 24 октября 2026.
  2. ^ a b c d JSON-RPC 1.0 Specification (2005). JSON-RPC. Дата обращения: 24 октября 2026.
  3. ^ About JSON-RPC. JSON-RPC. Дата обращения: 24 октября 2026.
  4. ^ JSON-RPC 1.1 Specification: Working Draft 7 August 2006. JSON-RPC (7 августа 2006). Дата обращения: 24 октября 2026.
  5. ^ JSON-RPC 1.2 proposal. JSON-RPC (27 декабря 2007). Дата обращения: 24 октября 2026.
  6. ^ Overview. StreamJsonRpc. Microsoft. Дата обращения: 24 октября 2026.
  7. ^ Overview: Security. StreamJsonRpc. Microsoft. Дата обращения: 24 октября 2026.
  8. ^ Official page for Language Server Protocol. Microsoft. Дата обращения: 24 октября 2026.
  9. ^ JSON-RPC API. ethereum.org. Дата обращения: 24 октября 2026.
  10. ^ Base Protocol: Overview. Model Context Protocol. Дата обращения: 24 октября 2026.
  11. ^ microsoft/vs-streamjsonrpc. GitHub. Дата обращения: 24 октября 2026.
  12. ^ VSCode JSON RPC. GitHub. Дата обращения: 24 октября 2026.
  13. ^ jsonrpcserver. Дата обращения: 24 октября 2026.
  14. ^ paritytech/jsonrpsee. GitHub. Дата обращения: 24 октября 2026.
  15. ^ Package jsonrpc. Go Packages. Дата обращения: 24 октября 2026.

Ссылки#edit

This article is mirrored from “JSON-RPC” on Русский Wikipedia, revision 155779363, written by Wikipedia's contributors and licensed CC BY-SA 4.0. Editing it here creates a Quire copy with its own history.

Synced with Wikipedia revision 155779363 · just now