Обзор
Цитируя спецификацию spec, JSONRPC «независим от транспорта, так как концепции могут быть использованы в одном процессе, по сокетам, по HTTP или во многих различных средах обмена сообщениями».
Для моделирования этой независимости библиотека jsonrpc использует объекты класса jsonrpc-connection, которые представляют собой подключение к удалённому JSON-точке (подробнее о системе объектов Emacs см. EIEIO в EIEIO). Современным языком объектно-ориентированного программирования, этот класс является «абстрактным», т. е. фактический класс полезного объекта подключения всегда является подклассом jsonrpc-connection. Тем не менее, мы можем определить два различных API вокруг класса jsonrpc-connection:
- Пользовательский интерфейс для построения приложений JSONRPC
В этом случае приложение JSONRPC выбирает конкретный подкласс
jsonrpc-connection, и приступает к созданию объектов этого подкласса с помощьюmake-instance. Для инициирования контакта с удалённой точкой приложения JSONRPC передаёт этот объект функциямjsonrpc-notify,jsonrpc-request, и/илиjsonrpc-async-request. Для обработки удалённо инициированных контактов, которые обычно поступают асинхронно, создание экземпляра должно включать:request-dispatcherи:notification-dispatcherinitargs, которые являются функциями от 3 аргументов: объект подключения; символ, обозначающий вызываемый удалённо метод JSONRPC; и объект JSONRPCparams.Функция, переданная как
:request-dispatcher, отвечает за обработку запросов удалённой точки, которые ожидают ответа от локальной точки (в этом случае — программы, которую вы создаёте). Внутри этой функции вы можете либо вернуть локально (нормальное возвращение), либо не локально (возвращение ошибки). Локальное возвращаемое значение должно быть объектом Lisp, который может быть сериализован как JSON (см. Парсинг JSON). Это определяет успешный ответ, и объект пересылается серверу как объект JSONRPCresult. Нелокальное возвращение, достигаемое вызовом функцииjsonrpc-error, приводит к отправке серверу ответа об ошибке. Подробности сопроводительного объекта JSONRPCerrorзаполняются тем, что было передано вjsonrpc-error. Нелокальное возвращение, вызванное непредвиденной ошибкой любого другого типа, также вызывает отправку ответа об ошибке (если вы не установилиdebug-on-error, в этом случае это вызовет отладчик Lisp, см. Отладка ошибок). - Интерфейс наследования для создания реализаций транспорта JSONRPC
В этом случае
jsonrpc-connectionподклассифицируется для реализации другой стратегии базового транспорта (подробнее о том, как подклассифицировать, см. (eieio)Наследование.). Пользователи интерфейса построения приложений могут затем создать экземпляры этого конкретного класса (с помощью функцииmake-instance) и подключиться к точкам JSONRPC, используя эту стратегию.Этот API имеет обязательные и необязательные части.
Чтобы позволить своим пользователям инициировать контакты JSONRPC (уведомления или запросы) или отвечать на запросы точки, подкласс должен иметь реализацию метода
jsonrpc-connection-send.Аналогично, для обработки трёх типов удалённых контактов (запросы, уведомления и ответы на локальные запросы), реализация транспорта должна организовать вызов функции
jsonrpc-connection-receiveпосле обнаружения нового сообщения JSONRPC в канале связи (каким бы «каналом» он ни был).Наконец, и необязательно, подкласс
jsonrpc-connectionдолжен реализовать методыjsonrpc-shutdownиjsonrpc-running-p, если эти концепции применимы к транспорту. Если это так, то все системные ресурсы (например, процессы, таймеры и т. д.), используемые для прослушивания сообщений в канале связи, должны быть освобождены вjsonrpc-shutdown, т. е. они должны потребоваться только, когдаjsonrpc-running-pне равно нулю.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/JSONRPC-Overview.html