Приемы описания документации API используя нотацию RAML

24.06.20

Интеграция - WEB-интеграция

В статье опишу приемы, которые использую в своей работе, и которые позволяют быстро реализовать описание.

Вводные

Нужно описать документацию на HTTP API, опубликовать в понятном заказчику и исполнителю виде.

 

Реализация

Для описания использую нотацию RAML (https://raml.org/), в результате получаю набор текстовых файлов которые удобно версионизировать в git. Для публикации использую формат HTML, .raml конвертирую в .hrml c помощью утилиты raml2html (https://github.com/raml2html/raml2html). С исходным текстом работаю используя Atom (https://atom.io/) и плагин API Workbench (https://atom.io/packages/api-workbench), в нем нормально работает автодополнение.

 

В средах разработки используется монофайл описания, что для меня не удобно (Обсуждение вопроса), проект из нескольких файлов можно собрать в один с помощью oas-raml-converter-cli (Ссылка на статью) более современный вариант webapi-parser (https://github.com/raml-org/webapi-parser).

 

Структура проекта

1. файл api.raml - корневой файл описания

2. папка dataTypes с описанием типов данных

3. папка resourceTypes с описанием типов ресурсов

4. папка securitySchemes - с схемами безопасности

 

Корневой файл

Обычно работаю с JSON форматом, поэтому в шапке описываю "mediaType: application/json", чтобы после в каждом ресурсе не уточнять.

Для всего API устанавливаю схему безопасности через "securedBy: token" (документация)

 
 Шапка api.raml

 

Ресурс по работе со справочниками описываю так:

 
 Ресурс product

Далее опишу из чего он компонуется и как на выходе получается CRUD описание

 

Типы данных

Все типы данных (схемы данных) организую в виде библиотеки и подключаю её в корневой файл

 
 Библиотека /dataTypes/library.raml
 
 Описание типа dataTypes/ProductType.raml

По умолчанию все реквизиты объектов "required: true", что отражается в публикации документации.

 

Если используются guid то добавляю тип, чтобы регулярные выражения заработали через параметр "pattern" не получилось, поэтому разместил в описании.

 
 Тип GUID

При размещении типа в корневом файле в файлах типов данных он может использоваться так:

 
 ProductType c parent тип GUID

 

При работе с объектом по API отправляю данные без идентификатора, получаю ответ с ним, для решения описания вопроса использую наследование объектов, добавляя нужные реквизиты к базовому типу

 
 Описание типа dataTypes/ProductResponseType.raml

 

Примеры типов данных

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

 
 Описание типа остатков
 
 Описание типа табличной части остатков
 
 Пример типа остатков

 

Типы ресурсов

Стандартный набор операций включает

  1. получение списка элементов, GET /
  2. получение элемента GET /{id}
  3. добавление элемента POST
  4. обновление элемента PUT /{id}
  5. удаление элемента DELETE /{id}

Описывать весь набор для каждого типа данных неудобно поэтому использую описание типов ресурсов (документация)

Использую описание для коллекции

 
 /resourceTypes/collection-item.type.raml

и для элемента

 
 /resourceTypes/item.type.raml

Подключаю в корневом файле

 
 подключение в api.raml

 

При ошибке поиска выдаю ответ 406, чтобы он не пересекался с 404, который может выдать сервер перед API и будет ложное срабатывание при схеме

Если GET /{id}=200 Тогда PUT /{id} Иначе POST / 

Формат ответа об ошибке один и тот же поэтому использую для этого отдельный тип

 
 /dataTypes/ResponseType.raml

 

Для использования имени url для получения типа данных использую "<<resourcePathName" (документация)

В результате состыковки будет подключен тип

properties:
   result:
   type: array
   items: DataLib.productResponse

 

Особенности

Для некоторых ресурсов нужна пагинация или фильтрация, её можно организовать в traits (особенности) (документация)

 
 Особенность фильтрации и пагинаци

и подключить её в ресурсе

get:
    is:  [filtered]

 

Итог

В результате компоновки инструментов можно быстро и качественно писать документацию на HTTP API и опубликовать

 
 Внешний вид опубликованного API
 
 Внешний вид описания ресурса

 

Благодарю за внимание.

RAML API

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    3091    5    0    

11

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    35230    70    45    

30

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

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

57600 руб.

26.11.2024    2836    2    3    

5

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    1111    7    2    

9

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    19326    24    22    

20

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    4810    4    2    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Steelvan 307 24.06.20 13:14 Сейчас в теме
Все эти технические форматы далеки от обычного человекочитаемого восприятия.

Вот например два похожих продукта (компонента для веб-гнезд) от разных разработчиков.

Бесплатная libwebsockets
https://libwebsockets.org/lws-api-doc-v4.0-stable/html/modules.html

Платная
https://cdn.nsoftware.com/help/IWF/bcb/

---

Да я лучше 30 000 заплачу сверху, но зато получу нормальную человекочитаемую доку.
Разбираться в бесплатном варианте буду дольше, чем эту 30-ку заработаю => время деньги.
2. malikov_pro 1331 24.06.20 13:24 Сейчас в теме
(1) В итогах показал внешний вид для "обычного человекочитаемого восприятия", конвертация делается утилитой через командную строку (у меня в проектах bat файлы для этого).
Примеры
https://www.sima-land.ru/api/v3/help
https://api.samsonopt.ru/v1/doc/index.html#api-v1-0-0
сформированы из OpenAPI (swagger).

Подобное можно формировать и из RAML https://docs.api-console.io/

У вас в примере WebSocket, у меня HTTP, разные протоколы и инструменты описания.
Оставьте свое сообщение