Предисловие
Перевожу данную спецификацию с расчетом, что смогу реализовать JSON-RPC с документированием через HTTP сервисы 1С. Сделать что-то вразумительное в стиле REST не получилось, сказалось отсутствие инструментария на уровне платформы (RegExp до сих пор не завезли). Вижу в качестве решения что перед 1С будет стоять прокси, в котором удобно реализовать современные протоколы, а 1С использовать как back-back-end. JSON-RPC стилистически похож на SOAP, но более легковесный (наличие автодокументации с JSON схемами перекрывает использование wsdl схем). Вопрос с валидацией схем пока открыт, есть наработки //infostart.ru/public/1265429/, но обвязки хранения и использования в контексте сервера еще не реализовано.
"|" - обозначает ИЛИ
"[]" - обозначает массив элементов
"GitHub Flavored Markdown", часто сокращаемый как GFM, - это диалект Markdown, который в настоящее время поддерживается для пользовательского контента на GitHub.com и GitHub Enterprise.
Введение
Спецификация OpenRPC определяет стандартное, не зависящее от языка программирования описание интерфейса для API JSON-RPC 2.0, которое позволяет как людям, так и компьютерам обнаруживать и понимать возможности службы, не требуя доступа к исходному коду, дополнительной документации или проверки сетевого трафика. При правильном определении через OpenRPC потребитель может понимать и взаимодействовать с удаленной службой с минимальным количеством логики реализации. Подобно описаниям интерфейсов для программирования более низкого уровня, спецификация OpenRPC устраняет догадки при вызове службы.
Варианты использования для машиночитаемых документов определения API JSON-RPC включают, но не ограничиваются:
- интерактивная документация
- генерация кода по документации
- клиенты
- серверы
- автоматизация тестирования.
Документы OpenRPC описывают API-сервисы JSON-RPC и представлены в формате JSON. Эти документы могут создаваться и обслуживаться статически или динамически из приложения.
Спецификация OpenRPC не требует переписывания существующих API JSON-RPC. Он не требует привязки какого-либо программного обеспечения к сервису - описываемый сервис может даже не принадлежать создателю его описания. Однако требуется, чтобы возможности службы были описаны в структуре спецификации OpenRPC. Не все сервисы могут быть описаны OpenRPC — эта спецификация не предназначена для покрытия API REST - она предназначена исключительно для API, которые придерживаются спецификации JSON-RPC 2.0. Спецификация OpenRPC не требует определенного процесса разработки, такого как design-first или code-first. Это облегчает любой метод, устанавливая четкие взаимодействия с API JSON-RPC.
Определения
Документ OpenRPC
Документ (или набор документов), который определяет или описывает API. Документ OpenRPC использует спецификацию OpenRPC и соответствует ей.
Поля шаблонов
Поле (пара ключ - значение), в котором имя ключа задается пользователем, а значение определяется спецификацией для шаблонного поля. Поле шаблона является регулярным выражением.
Регулярное выражение
В спецификации OpenRPC и инструментах рекомендуется использовать регулярные выражения, совместимые с Perl. При этом разработчики инструментов ДОЛЖНЫ придерживаться регулярных выражений ECMA-262 6th Edition.
Официальный OpenRPC инструментарий (Tooling)
Инструмент, который создается, поддерживается и документируется организацией OpenRPC. Он предназначен для использования в качестве функциональной эталонной реализации спецификации. Пользователям спецификации OpenRPC рекомендуется создавать версии инструмента как свою собственные организации/проекты.
Примечание переводчика: Ссылки на инструменты https://open-rpc.org/developers
- https://playground.open-rpc.org/
- https://marketplace.visualstudio.com/items?itemName=OPEN-RPC.OPEN-RPC
Версии
Спецификация OpenRPC версионируется с использованием семантического управления версиями 2.0.0.
Часть версии"major.minor" (например, 1.0.x) ДОЛЖНА обозначать набор функций OpenRPC. Как правило, версии ".patch" устраняют ошибки в этом документе, а не в наборе функций. Инструментарий, поддерживающий OpenRPC 1.0.0, ДОЛЖЕН быть совместим со всеми версиями OpenRPC 1.0.x. Версия исправления НЕ ДОЛЖНА учитываться инструментами, не делая различий, например, между 1.0.0 и 1.0.1.
Последующие выпуски второстепенных версий спецификации OpenRPC (увеличение "minor" номера версии) НЕ должно мешать инструменту, разработанному для более низкой младшей версии и той же основной версии. Таким образом, гипотетическая 1.1.0 спецификация ДОЛЖНА использоваться с инструментами, предназначенными для 1.0.0.
Документ OpenRPC, совместимый с OpenRPC 1.0.0, содержит обязательное "openrpc" поле, которое обозначает семантическую версию OpenRPC, которую он использует.
Формат
Документ OpenRPC, соответствующий спецификации OpenRPC, сам по себе является объектом JSON, который должен быть представлен в формате JSON. Из-за характера API-интерфейсов JSON-RPC, использующих форматы JSON, строго используйте JSON только так, как описано здесь. Если вы хотите использовать любой другой формат, кроме JSON, он должен быть преобразован вне любого инструмента OpenRPC.
Примечание переводчика: для ручного формирования документации удобнее использовать YAML, проверено на Swagger/OpenAPI, но позиция авторов такова что "только JSON", https://github.com/open-rpc/spec/issues/265. Использовать конвертер JSON<->YAML ради удобного просмотра или формирования без автодополнения неудобно.
Рекомендуется, чтобы документ OpenRPC назывался: openrpc.json. Инструмент , для ввода которого требуется документ OpenRPC, МОЖЕТ принять расположение документа по умолчанию "./openrpc.json", где "./" представляет текущий рабочий каталог.
Все имена полей в спецификации чувствительны к регистру. camelCase СЛЕДУЕТ использовать для всех ключевых имен. Сюда входят все поля, которые используются в качестве ключей в соответствии (map), за исключением случаев, когда явно указано, что ключи нечувствительны к регистру.
Согласно спецификации JSON для объектов, имена ключей ДОЛЖНЫ быть уникальными. Однако, чтобы избежать двусмысленности, все шаблонные поля в документе OpenRPC ДОЛЖНЫ иметь уникальные имена ключей внутри содержащего объекта.
Форматирование текста
Все поля спецификации "description" отмечены как поддерживающие форматирование Github markdown. Там, где инструмент OpenRPC отображает форматированный текст, он ДОЛЖЕН поддерживать, как минимум, синтаксис markdown, как описано в GitHub Flavored Markdown. Tooling МОЖЕТ игнорировать некоторые функции "GitHub Flavored Markdown" для решения проблем безопасности.
Метод обнаружения службы
API JSON-RPC могут поддерживать спецификацию OpenRPC, реализуя метод обнаружения служб, который возвращает схему OpenRPC для API JSON-RPC. Метод ДОЛЖЕН быть назван "rpc.discover." "rpc." префикс является зарезервированным префиксом метода для системных расширений спецификации JSON-RPC 2.0. Ниже приведена спецификация OpenRPC для метода обнаружения службы:
{
"methods": [
{
"name": "rpc.discover",
"description": "Returns an OpenRPC schema as a description of this service",
"result": {
"name": "OpenRPC Schema",
"schema": {
"$ref": "https://raw.githubusercontent.com/open-rpc/meta-schema/master/schema.json"
}
}
}
]
}
Примеры
Примеры документов OpenRPC можно найти в OpenRPC Examples. Должен быть пример, который использует каждую концепцию спецификации. Эти примеры должны быть использованы в качестве основы тестирования для всех официальных инструментов OpenRPC.
Объект OpenRPC
Это корневой объект документа OpenRPC. Содержимое этого объекта представляет собой целый документ OpenRPC. То, как этот объект создается или хранится, выходит за рамки спецификации OpenRPC.
Имя поля | Тип | Описание |
---|---|---|
openrpc | строка | Обязательное. Эта строка ДОЛЖНА быть семантическим номером версии спецификации Open RPC, используемой в документе OpenRPC. Поле openrpc ДОЛЖНО использоваться спецификациями инструментов и клиентами для интерпретации документа OpenRPC. Это не связано со строкой API info.version. |
info | Объект информации | Обязательное. Предоставляет метаданные об API. Метаданные МОГУТ быть использованы инструментарием по мере необходимости. |
servers | [Объект сервера] | Массив серверных объектов, которые предоставляют информацию о подключении к целевому серверу. Если свойство "servers" не указано или представляет собой пустой массив, значением по умолчанию будет объект Server со значением URL localhost. |
methods |
[Объект метода] |[Объект примера] |
Обязательное. Доступные методы для API. Пока это требуется, массив может быть пустым (например, для обработки фильтрации безопасности). |
components | Объект компонента | Элемент для хранения различных схем для спецификации. |
externalDocs | Объект внешней документации | Дополнительная внешняя документация. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект информации (Info Object)
Объект предоставляет метаданные об API. Метаданные МОГУТ быть использованы клиентами, если это необходимо, и МОГУТ быть представлены в инструментах редактирования или создания документации для удобства.
Имя поля | Тип | Описание |
---|---|---|
title | строка | Обязательное. Название приложения |
description | строка | Подробное описание приложения. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
termsOfService | строка | URL-адрес Условий предоставления услуг для API. ДОЛЖЕН быть в формате URL. |
contact | Объект контакта | Контактная информация для открытого API. |
license | Объект лицензии | Информация о лицензии для открытого API. |
version | строка | Обязательное. Версия документа Open RPC (которая отличается от версии спецификации OpenRPC или версии реализации API). |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект контакта (Contact Object)
Контактная информация для открытого API.
Имя поля | Тип | Описание |
---|---|---|
name | строка | Идентифицирующее имя контактного лица/организации. |
url | строка | URL-адрес, указывающий на контактную информацию. ДОЛЖЕН быть в формате URL. |
строка | Адрес электронной почты контактного лица/организации. ДОЛЖЕН быть в формате адреса электронной почты. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект лицензии (License Object)
Информация о лицензии для открытого API.
Имя поля | Тип | Описание | |
---|---|---|---|
name | строка |
|
|
url | строка | URL-адрес лицензии, используемой для API. ДОЛЖЕН быть в формате URL. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект сервера (Server Object)
Объект описывающий сервер.
Имя поля | Тип | Описание |
---|---|---|
name | строка | Обязательное. Имя, которое будет использоваться в качестве канонического имени сервера. |
url | Выражение выполнения | Обязательное. URL-адрес целевого хоста. Этот URL-адрес поддерживает переменные сервера и МОЖЕТ быть относительным, чтобы указать, что местоположение хоста относительно местоположения, в котором обслуживается документ OpenRPC. Переменные сервера передаются в выражение времени выполнения для создания URL-адреса сервера. |
summary | строка | Краткое изложение того, что такое сервер. |
description | строка | Необязательная строка, описывающая хост, назначенный URL. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
variables | Соответствие из строк | Объект переменных сервера | Сопоставление между именем переменной и ее значением. Значение передается в выражение среды выполнения для создания URL-адреса сервера. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект переменных сервера (Server Variable Object)
Объект, представляющий серверную переменную для замены шаблона URL-адреса сервера.
Имя поля | Тип | Описание |
---|---|---|
enum | [строка] | Массив строковых значений, которые будут использоваться, если параметры подстановки из ограниченного набора. |
default | строка |
Обязательное. Значение по умолчанию для подстановки, которое будет отправлено, если альтернативное значение не указано. Обратите внимание, что это поведение отличается от обработки объектом схемы значений по умолчанию, поскольку в этих случаях значения параметров являются необязательными. |
description | строка | Необязательное описание для переменной сервера. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект метода (Method Object)
Описывает интерфейс для данного имени метода. Имя метода используется в качестве поля метода тела JSON-RPC. Поэтому он ДОЛЖЕН быть уникальным.
Имя поля | Тип | Описание |
---|---|---|
name | строка | Обязательное. Каноническое имя метода. Имя ДОЛЖНО быть уникальным в массиве методов. |
tags | [Объект тега | Эталонный объект] | Список тегов для управления документацией API. Теги могут использоваться для логической группировки методов по ресурсам или любому другому классификатору. |
summary | строка | Краткое изложение того, что делает метод. |
description | строка | Подробное объяснение поведения метода. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
externalDocs | Внешний объект документации | Дополнительная внешняя документация для этого метода. |
params | [Дескриптор содержимого | Эталонный объект] | Обязательное. Список параметров, применимых для этого метода. Список НЕ ДОЛЖЕН содержать дублированных параметров и поэтому требует, чтобы имя было уникальным. Список может использовать ссылочный объект для ссылки на параметры, определенные объектом "Дескриптор содержимого". Все необязательные параметры (объекты дескриптора содержимого с "required": false) ДОЛЖНЫ располагаться после всех обязательных параметров в списке. |
result | [Дескриптор содержимого | Эталонный объект] | Обязательное. Описание результата, возвращаемого методом. Это ДОЛЖЕН быть Дескриптор содержимого. |
deprecated | булево | Объявляет этот метод устаревшим. Потребители ДОЛЖНЫ воздерживаться от использования заявленного метода. Значение по умолчанию "false". |
servers | [Объект сервера] | Альтернативный массив "servers" для обслуживания этого метода. Если альтернативный массив "servers" указан на корневом уровне, он будет переопределен этим значением. |
errors | [Объект ошибки | Эталонный объект] | Список ошибок, определяемых пользовательским приложением, которые МОГУТ быть возвращены. Ошибки ДОЛЖНЫ иметь уникальные коды ошибок. |
links | [Объект ссылки | Эталонный объект] | Список возможных ссылок из этого вызова метода. |
paramStructure | "by-name" | "by-position" | "either" |
Ожидаемый формат параметров. Согласно спецификации JSON-RPC 2.0, параметрами объекта запроса JSON-RPC могут быть "массив", "объект" или "любой из" (представленные как "by-position", "by-name" и "either" соответственно). Когда метод имеет значение "paramStructure", равное "by-name", вызывающие метод ДОЛЖНЫ отправить объект запроса JSON-RPC, поле параметров которого является объектом. Кроме того, имена ключей объекта params ДОЛЖНЫ совпадать с "contentDescriptor.names" для данного метода. По умолчанию используется значение "either". |
examples | "Объект парного примера" | Массив из "Объект парного примера", где каждый пример включает в себя допустимое сопряжение параметров запроса с результатом "Дескриптор содержимого". |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект дескриптора содержимого (Content Descriptor Object)
Дескрипторы контента - это объекты, которые делают то, что они предлагают- описывают контент. Это многоразовые способы описания параметров или результата. Они ДОЛЖНЫ иметь схему.
Имя поля | Тип | Описание | |
---|---|---|---|
name | строка | Обязательное. Имя описываемого содержимого. Если описанное содержимое является назначаемым параметром метода by-name, это поле ДОЛЖНО определять ключ параметра (т. е. Имя). | |
summary | строка |
|
|
description | строка | Подробное объяснение поведения дескриптора содержимого. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. | |
required | булево | Определяет, является ли содержимое обязательным полем. Значение по умолчанию "false". | |
schema | Объект схемы | Обязательное. Схема, описывающая содержимое. | |
deprecated | булево | Указывает, что содержимое устарело и ДОЛЖНО быть выведено из использования. Значение по умолчанию "false". |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект схемы (Schema Object)
Объект схемы позволяет определять типы входных и выходных данных. Объекты схемы ДОЛЖНЫ соответствовать описанию спецификаций JSON Schema Specification 7, каждый раз, когда объект схемы может использоваться, вместо него может использоваться "Ссылочный объект". Это позволяет ссылаться на определения, а не определять их повторно (inline).
Объект парного примера (Example Pairing Object)
Объект примера состоит из набора параметров примера и результата. Результат-это то, что вы можете ожидать от службы JSON-RPC, учитывая точные параметры.
Имя поля | Тип | Описание | |
---|---|---|---|
name | строка |
|
|
description | строка | Подробное объяснение примера сопряжения. | |
summary | строка | Краткое описание примера сопряжения. | |
params | [Объект примера| Объект ссылки] | Пример параметров. | |
result | Объект примера| Объект ссылки | Пример результата. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект примера (Example Object)
Объект примера - это объект, определяющий пример, который должен соответствовать заданной "Схеме дескриптора содержимого". Если "Схема дескриптора содержимого" включает "examples", значение из этого примера объекта заменяет значение примера схемы.
Имя поля | Тип | Описание |
---|---|---|
name | строка | Каноническое имя примера. |
summary | строка | Краткое описание примера. |
description | строка | Подробное объяснение примера. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
value | любой | Встроенный буквальный пример. Поля "value" и "externalValue" являются взаимоисключающими. Чтобы представить примеры типов носителей, которые не могут быть естественным образом представлены в JSON, используйте строковое значение, содержащее пример, экранируя его там, где это необходимо. |
externalValue | строка | URL-адрес, указывающий на буквальный пример. Это дает возможность ссылаться на примеры, которые не могут быть легко включены в документы JSON. Поля "value" и "externalValue" являются взаимоисключающими. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект ссылки (Link Object)
Объект ссылки представляет собой возможную ссылку проектирования для результата. Наличие ссылки не гарантирует способность вызывающего абонента успешно вызывать ее, скорее она обеспечивает известную связь и механизм обхода между результатами и другими методами.
В отличие от динамических ссылок (т.е. Ссылок, предоставляемых в полезной нагрузке результата), механизм связывания OpenRPC не требует информации о ссылках в результате выполнения.
Для вычисления ссылок и предоставления инструкций, а так же для их выполнения "выражение выполнения" используется для доступа к значениям в методе и использования их в качестве параметров при вызове связанного метода.
Имя поля | Тип | Описание |
---|---|---|
name | строка | Обязательное. Каноническое имя ссылки. |
description | строка | Описание ссылки. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
summary | строка | Краткое описание для ссылки. |
method | строка | Имя существующего разрешаемого метода OpenRPC, определенного с помощью уникального "method". Это поле ДОЛЖНО быть преобразовано в уникальный объект метода. В отличие от OpenAPI, относительные "method" значения НЕ допускаются. |
params |
Соответствие из строка | любой | выражение выполнения |
Соответствие, представляющая параметры для передачи методу, как указано в "method". Ключ - это имя параметра, которое будет использоваться, тогда как значение может быть константой или "выражение выполнения", которое будет вычислено и передано связанному методу. |
server | Объект сервера | Объект сервера, используемый целевым методом. |
Связанный метод должен быть идентифицирован непосредственно и должен существовать в списке методов, определенных объектом Methods.
Когда выражение среды выполнения не выполняется, целевому методу не передается значение параметра.
Значения из результата могут использоваться для управления связанным методом.
Клиенты переходят по всем ссылкам по своему усмотрению. Ни разрешения, ни возможность успешного вызова этой ссылки не гарантируется исключительно существованием отношения.
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Выражение выполнения (Runtime Expression)
Выражения выполнения позволяют пользователю определить выражение, которое будет вычисляться в строку, как только будут известны желаемые значения. Они используются, когда желаемое значение ссылки или сервера может быть создано только во время выполнения. Этот механизм используется "Объектами ссылок" и "Переменными сервера".
Выражение времени выполнения использует синтаксис языка шаблонов JSON.
В таблице ниже приведены примеры выражений времени выполнения и примеры их использования в значении:
в документации таблица отсутствует
Выражения времени выполнения сохраняют тип ссылочного значения.
Объект ошибки (Error Object)
Определяет ошибку уровня приложения.
Имя поля | Тип | Описание | |
---|---|---|---|
code | Код ошибки, определяемый приложением | Обязательное. Число, указывающее тип ошибки, которая произошла. Это ДОЛЖНО быть целое число. Коды ошибок от -32768 до -32000 зарезервированы для предопределенных ошибок. Предполагается, что эти предопределенные ошибки возвращаются из любого API JSON-RPC. | |
message | строка |
|
|
data | любой | Примитивное или структурированное значение, содержащее дополнительную информацию об ошибке. Это может быть опущено. Значение этого члена определяется Сервером (например, подробная информация об ошибках, вложенные ошибки и т.д.). |
Объект компоненты (Components Object)
Содержит набор повторно используемых объектов для различных аспектов OpenRPC. Все объекты, определенные в объекте components, не будут влиять на API, если на них явно не ссылаются свойства вне объекта components.
Имя поля | Тип | Описание |
---|---|---|
contentDescriptors | соответствие(строка, Объект дескриптора содержимого) | Объект для хранения повторно используемых "Объект дескриптора содержимого" |
schemas | соответствие(строка, Объект схемы) | Объект для хранения повторно используемых "Объект схемы" |
examples | соответствие(строка, Объект примера) | Объект для хранения повторно используемых "Объект примера" |
links | соответствие(строка, Объект ссылки) | Объект для хранения повторно используемых "Объект ссылки" |
errors | соответствие(строка, Объект ошибки) | Объект для хранения повторно используемых "Объект ошибки" |
examplePairingObjects | соответствие(строка, Объект парного примера) | Объект для хранения повторно используемых "Объект парного примера" |
tags | соответствие(строка, Объект тега) | Объект для хранения повторно используемых "Объект тега" |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Все фиксированные поля, объявленные выше, являются объектами, которые ДОЛЖНЫ использовать ключи, соответствующие регулярному выражению: "^[a-zA-Z0-9\.\-_]+$"
Объект тега (Tag Object)
Добавляет метаданные к одному тегу, который используется "Объект метода". Не обязательно иметь объект тега для каждого тега, определенного в экземплярах объекта метода.
Имя поля | Тип | Описание |
---|---|---|
name | строка | Обязательное. Имя тега. |
summary | строка | Краткое описание тега. |
description | строка | Подробное объяснение тега. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
externalDocs | Объект внешней документации | Дополнительная внешняя документация для этого тега. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект внешней документации (External Documentation Object)
Позволяет ссылаться на внешний ресурс для расширенной документации.
Имя поля | Тип | |
description | строка | Подробное объяснение целевой документации. Синтаксис GitHub Flavored Markdown МОЖЕТ использоваться для представления расширенного текста. |
url | строка | Обязательное. URL-адрес целевой документации. Значение ДОЛЖНО быть в формате URL. |
Этот объект МОЖЕТ быть расширен с помощью расширений спецификации.
Объект ссылки
Простой объект, позволяющий ссылаться на другие компоненты спецификации, внутренние и внешние.
Ссылочный объект определяется схемой JSON и следует той же структуре, поведению и правилам.
Имя поля | Тип | Описание |
---|---|---|
$ref | строка | Обязательное. Ссылочная строка. |
Этот объект не может быть расширен дополнительными свойствами, и любые добавленные свойства должны игнорироваться.
Расширения спецификации
В то время как спецификация OpenRPC пытается приспособить большинство вариантов использования, дополнительные данные могут быть добавлены для расширения спецификации в определенных точках.
Свойства расширений реализуются в виде шаблонных полей, которые всегда имеют префикс "x-".
Расширения могут поддерживаться или не поддерживаться доступными инструментами, но они также могут быть расширены для добавления запрашиваемой поддержки (если инструменты являются внутренними или открытыми).
Благодарю за внимание.