<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Mikrotik.moscow [тема: Запрос функции: OpenAPI для REST API]</title>
		<link>http://mikrotik.moscow</link>
		<description>Новое в теме Запрос функции: OpenAPI для REST API форума RouterOS на сайте Mikrotik.moscow [mikrotik.moscow]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 28 Jun 2026 04:14:51 +0300</pubDate>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433165">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Дел продвинул далеко с /console/inspect. В общем, между restraml schemas+diff (используя request=syntax и request=child), которые работают с RAML и OpenAPI схемами, и RouterOS LSP для подсветки синтаксиса/ошибок/автозаполнения (используя request=completion и request=highlight) — используется почти всё, что может предложить /console/inspect. Хотя LSP довольно неплохо работает с данными об автозаполнении и подсветке от inspect.<br /><br />Но у RouterOS LSP есть ограничение — я так и не смог надёжно понять, что именно является «текущей рабочей директорией» при использовании /console/inspect с запросами типа request=... input="код". Представление LSP о скрипте RouterOS — это только «highlight» токены, привязанные к позиции текста в редакторе LSP (VSCode, nvim и прочих). А вот токенизатор Inspect точно знает текущий path= (в смысле ip,address), потому что умеет разрешать подсценарии вроде [find] и прочий синтаксис, который по умолчанию содержит путь.<br /><br />В некоторых случаях путь можно вывести, например /ip/address/add..., где он полностью квалифицирован. Из-за этого LSP ограничен возможностью request=syntax давать редактору «сигнатуру» (то есть помощь CLI по F1). Так что, если у вас есть новые «пасхалки» по поводу этой проблемы cwd, буду рад узнать.<br /><br />Полный список ограничений /console/inspect здесь:...<br /><br />И ещё загадка — /console/inspect request=error. Я до сих пор не могу понять, что он делает. Есть какие-нибудь новые идеи? Он всегда возвращает nil, независимо от того, что передано (валидный код или самый плохой синтаксис):<br /><br />:put [:typeof [/console/inspect request=error input=":put [/system/identity/get name]"]]  <br /># nil<br /><br />:put [:typeof [/console/inspect request=error input="/somebadcommand"]]  <br /># nil<br /><br />Но, подозреваю, что он что-то всё-таки делает, просто я пока не понял что. Сейчас это загадка в этой «пасхальной» инспекции. <br />
			<i>10.07.2025 19:01:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433165</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433165</guid>
			<pubDate>Thu, 10 Jul 2025 19:01:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433164">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Недавно я автоматизировал создание файлов схем на GitHub, включая OpenAPI 2.0 (OAS2). Так что более новые (и старые) версии схем RAML и OpenAPI доступны по адресу: <noindex><a href="https://tikoci.github.io/restraml" target="_blank" rel="nofollow" >https://tikoci.github.io/restraml</a></noindex>. На той же странице есть удобный инструмент для сравнения (diff), чтобы увидеть изменения между версиями RouterOS. Теперь проще отслеживать изменения между версиями… <img class="lazyload "  src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/upload/forum/mikrotik/8adb0eb408090c6cb1c5af5b03ae268970751142.png" alt="Пользователь добавил изображение" border="0" /> <br />
			<i>27.05.2024 12:21:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433164</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433164</guid>
			<pubDate>Mon, 27 May 2024 12:21:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433163">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Вау! Спасибо, отличная работа! <br />
			<i>14.12.2023 20:55:00, brotherdust.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433163</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433163</guid>
			<pubDate>Thu, 14 Dec 2023 20:55:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433162">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Вот схема OpenAPI, которую я сгенерировал на основе приведённой выше RAML-схемы. Схема OpenAPI 3.0 / swagger <noindex><a href="https://tikoci.github.io/restraml/routeros-openapi3.json" target="_blank" rel="nofollow" >https://tikoci.github.io/restraml/routeros-openapi3.json</a></noindex> Возможно, в ней есть вызовы, которые не допускаются, и кое-что могло перевестись не идеально. Но она загружается: <br />
			<i>11.09.2023 17:49:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433162</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433162</guid>
			<pubDate>Mon, 11 Sep 2023 17:49:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433161">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Я как-то забыл об этом. Но у меня есть реализация на JavaScript, которая использует /system/console через REST и генерирует схему RAML 1.0. Смотрите <noindex><a href="https://forum.mikrotik.com/viewtopic.php?t=199476" target="_blank" rel="nofollow" >https://forum.mikrotik.com/viewtopic.php?t=199476</a></noindex> для альтернативы на основе RAML. Редакция: заметил, что это был бета-форум, поэтому перенес подход с RAML в новую тему в разделе Scripting. <br />
			<i>11.09.2023 03:00:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433161</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433161</guid>
			<pubDate>Mon, 11 Sep 2023 03:00:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433160">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Сегодня снова пересмотрел это, думал, будет легко получить «объяснение». Хотя «request=child» работает с issue, некоторые «request=syntax» (например, «path=ip,address,add,interface», см. ниже) вызывают полный сбой терминала («Console has crashed; please log in again.») — при этом большинство запросов с request=syntax работают нормально.<br /><br />[user@router] &gt; /console/inspect request=syntax path=ip,address,add  <br />Колонки: TYPE, SYMBOL, SYMBOL-TYPE, NESTED, NONORM, TEXT &nbsp;<br />TYPE &nbsp; &nbsp;SYMBOL &nbsp; &nbsp; SYMBOL-TYPE &nbsp;NESTED &nbsp;NONORM &nbsp;TEXT &nbsp;<br />syntax &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; collection &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp;yes &nbsp;<br />syntax &nbsp;address &nbsp; &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Локальный IP-адрес &nbsp;<br />syntax &nbsp;broadcast &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Широковещательный адрес &nbsp;<br />syntax &nbsp;comment &nbsp; &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Краткое описание элемента &nbsp;<br />syntax &nbsp;copy-from &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Номер элемента &nbsp;<br />syntax &nbsp;disabled &nbsp; explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Определяет, игнорируется элемент или используется &nbsp;<br />syntax &nbsp;interface &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Имя интерфейса &nbsp;<br />syntax &nbsp;netmask &nbsp; &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Маска сети &nbsp;<br />syntax &nbsp;network &nbsp; &nbsp;explanation &nbsp; &nbsp; &nbsp; 1 &nbsp;no &nbsp; &nbsp; &nbsp;Префикс сети &nbsp;<br /><br />[user@router] &gt; /console/inspect request=syntax path=ip,address,add,address  <br />Колонки: TYPE, SYMBOL, SYMBOL-TYPE, NESTED, NONORM, TEXT &nbsp;<br />TYPE &nbsp; &nbsp;SYMBOL &nbsp; SYMBOL-TYPE &nbsp;NESTED &nbsp;NONORM &nbsp;TEXT &nbsp;<br />syntax &nbsp;Address &nbsp;definition &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp;no &nbsp; &nbsp; &nbsp;A.B.C.D &nbsp; &nbsp;(IP-адрес) &nbsp;<br /><br />[user@router] &gt; /console/inspect request=syntax path=ip,address,add,interface  <br /><br />Консоль упала; пожалуйста, войдите снова. Даже обернув это в «:do {} on-error={}» сбой не ловится, так что этот способ не сработал. &nbsp;<br /><br />:do { &nbsp;<br /> &nbsp; /console/inspect request=syntax path=ip,address,add,interface &nbsp;<br />} on-error={:put "got error"} &nbsp;<br /><br />Хотя для схемы это не было бы критично, там всё же есть описание, которое можно установить, и есть какой-то узел типа «collection», который, вероятно, указывает на возможный массив (а не просто строку) в качестве параметра JSON. &nbsp;<br /><br />К слову, тот же /console/inspect можно вызвать и через REST API. Но при тех же параметрах в REST («{ “request”: “syntax”, &nbsp;“path”: “ip,address,add,interface” }») терминал не падает, а просто виснет без данных (пустой JSON-массив). &nbsp;<br /><br />На самом деле, вот RAML для /console/inspect: &nbsp;<br />#%RAML 1.0 &nbsp;<br />title: ROS.RAML sample &nbsp;<br />version: 7.6 &nbsp;<br />protocols: [HTTPS]  <br />mediaType: [application/json]  <br />securitySchemes: &nbsp;<br /> &nbsp;basic: &nbsp;<br /> &nbsp; &nbsp;description: | &nbsp;<br /> &nbsp; &nbsp; &nbsp;Mikrotik REST API поддерживает только Basic Authentication, защищённую HTTPS &nbsp;<br /> &nbsp; &nbsp;type: Basic Authentication &nbsp;<br />securedBy: [basic]  <br />baseUri: https://{host}:{port}/rest &nbsp;<br />baseUriParameters: &nbsp;<br /> &nbsp;host: &nbsp;<br /> &nbsp; &nbsp;description: IP-адрес или имя хоста устройства RouterOS &nbsp;<br /> &nbsp; &nbsp;default: "192.168.88.1" &nbsp;<br /> &nbsp;port: &nbsp;<br /> &nbsp; &nbsp;description: HTTPS-порт RouterOS &nbsp;<br /> &nbsp; &nbsp;default: "443" &nbsp;<br />documentation: &nbsp;<br /> &nbsp;- title: RouterOS RAML Schema &nbsp;<br /> &nbsp; &nbsp;content: | &nbsp;<br /> &nbsp; &nbsp; &nbsp;Схема генерируется с помощью `/console/inspect` на устройствах RouterOS и &nbsp;<br /> &nbsp; &nbsp; &nbsp;интерпретируется согласно правилам из &nbsp;<br /> &nbsp; &nbsp; &nbsp;[Mikrotik REST documentation](<noindex><a href="https://help.mikrotik.com" target="_blank" rel="nofollow" >https://help.mikrotik.com</a></noindex>) &nbsp;<br /> &nbsp;- title: Только демо &nbsp;<br /> &nbsp; &nbsp;content: Просто пробуем несколько команд &nbsp;<br /><br />/console: &nbsp;<br /> &nbsp;/inspect: &nbsp;<br /> &nbsp; &nbsp;post: &nbsp;<br /> &nbsp; &nbsp; &nbsp;description: Инспекция AST RouterOS &nbsp;<br /> &nbsp; &nbsp; &nbsp;body: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;application/json: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: object &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;properties: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.proplist?: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: string &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;description: Список свойств для возврата (смотрите документы RouterOS) &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.query?: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: string &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;description: Список свойств для возврата (смотрите документы RouterOS) &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;path?: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: string &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;description: Строка путей RouterOS, разделённых запятыми &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;example: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;input?: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: string &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;request: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: string &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;enum: [self|child|completion|highlight|syntax|error]  <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;example: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;path: "ip,address,add,interface" &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;request: syntax &nbsp;<br /> &nbsp; &nbsp; &nbsp;responses: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;200: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;body: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;application/json: &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type: array <br />
			<i>13.11.2022 22:34:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433160</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433160</guid>
			<pubDate>Sun, 13 Nov 2022 22:34:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433159">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Отличная информация, спасибо! Похоже, что метаданные proxy-repository довольно согласованы и действительно стоят того, чтобы их изучить для построения дерева команд для автоматической интеграции. С RAML я согласен. <br />
			<i>09.11.2022 14:07:00, Larsa.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433159</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433159</guid>
			<pubDate>Wed, 09 Nov 2022 14:07:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433158">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Но теперь мы можем их найти. Это не критично для моих задач, но я написал код, который вытягивает все «дочки» (request=child) из /console/inspect. Он использует рекурсию с ROS-функцией для обхода дерева «child» и возвращает ROS::array (и одновременно кладёт результат в глобальную переменную “$ast”). Удивительно, но это НЕ вызывает переполнение стека или превышение лимитов памяти, по крайней мере в версии v7.6. <br /><br />На самом деле, после обхода дерева, даже на небольшом cAP, находится 4329 уникальных ветвей “cmd”, “args” и “path”, каждая с несколькими листами.<br /><br />:global ast [:toarray ""]<br /><br />:global mkast do={<br /> &nbsp; &nbsp;:global mkast<br /> &nbsp; &nbsp;:global ast<br /> &nbsp; &nbsp;:local path ""<br /> &nbsp; &nbsp;:if ([:typeof $1] ~ "str|array") do={ :set path $1 }<br /> &nbsp; &nbsp;:local pchild [/console/inspect as-value request=child path=$path]<br /> &nbsp; &nbsp;:foreach k,v in=$pchild do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if (($v-&gt;"type") = "child") do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:local astkey ""<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:local arrpath [:toarray $path]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:foreach part in=$arrpath do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:set astkey "$astkey/$part"<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:set ($ast-&gt;$astkey-&gt;($v-&gt;"name")) $v<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:put "Обрабатываю: $astkey $($v-&gt;"name") $($v-&gt;"node-type")"<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:local newpath "$($path),$($v-&gt;"name")"<br /> &nbsp; &nbsp;		# TODO использовать [/console/inspect as-value request=syntax path=$path]<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[$mkast $newpath]<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp;return $ast<br />}<br /><br /># и этот вызов запускает рекурсию<br />:put [$mkast]<br /><br />$ast также будет содержать схему в виде вложенного массива, отражающего отношения родитель/дочка… так что можно использовать так: :put ($ast-&gt;"/ip/address")<br /><br />add=.id=*2;name=add;node-type=cmd;type=child;comment=.id=*3;name=comment;node-type=cmd;type=child;disable=.id=*4;name=disable;node-type=cmd;type=child;edit=.id=*5;name=edit;node-type=cmd;type=child;enable=.id=*6;name=enable;node-type=cmd;type=child;export=.id=*7;name=export;node-type=cmd;type=child;find=.id=*8;name=find;node-type=cmd;type=child;get=.id=*9;name=get;node-type=cmd;type=child;print=.id=*a;name=print;node-type=cmd;type=child;remove=.id=*b;name=remove;node-type=cmd;type=child;reset=.id=*c;name=reset;node-type=cmd;type=child;set=.id=*d;name=set;node-type=cmd;type=child<br /><br />Ещё пример — часть вывода массива $ast выше в виде YAML-подобного формата:<br /><br />/zerotier/edit:<br /> &nbsp; &nbsp;number:<br /> &nbsp; &nbsp; &nbsp;.id: *2<br /> &nbsp; &nbsp; &nbsp;name: number<br /> &nbsp; &nbsp; &nbsp;node-type: arg<br /> &nbsp; &nbsp; &nbsp;type: child<br /> &nbsp; &nbsp;value-name:<br /> &nbsp; &nbsp; &nbsp;.id: *3<br /> &nbsp; &nbsp; &nbsp;name: value-name<br /> &nbsp; &nbsp; &nbsp;node-type: arg<br /> &nbsp; &nbsp; &nbsp;type: child<br /> &nbsp;/zerotier/enable:<br /> &nbsp; &nbsp;numbers:<br /> &nbsp; &nbsp; &nbsp;.id: *2<br /> &nbsp; &nbsp; &nbsp;name: numbers<br /> &nbsp; &nbsp; &nbsp;node-type: arg<br /> &nbsp; &nbsp; &nbsp;type: child<br /><br />Я тут это не делал, но если добавить ещё один вызов “/console/inspect request=syntax …” для каждого child с тем же путём, можно получить описание (например, тип — «объяснение»). Тогда у вас будет вся информация для REST-схемы. Думаю, RAML было бы легче сгенерировать из ROS-скрипта, так как он использует формат YAML, а не JSON, и YAML проще сгенерировать в ROS-скрипте. Мне кажется, ключи из моего кода достаточно близки к REST POST-полям, так что это будет самый простой путь смоделировать в RAML. <br /><br />И, насколько я знаю, кое-какие инструменты могут использовать или конвертировать схему из RAML в swagger/OpenAPI. Но /console/inspect действительно содержит данные для REST-схемы, хотя конвертация — это всё ещё дополнительная работа. <br /><br />Единственное замечание: /console/inspect, похоже, знает обо всех пакетах (например, «extra-packages»), даже если они не установлены — так что вы увидите child-записи для calea, iot и прочих, даже если они недоступны. <br />
			<i>09.11.2022 13:47:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433158</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433158</guid>
			<pubDate>Wed, 09 Nov 2022 13:47:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433157">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Это пасхалка <br />
			<i>08.11.2022 19:03:00, mrz.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433157</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433157</guid>
			<pubDate>Tue, 08 Nov 2022 19:03:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433156">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Интересно, есть ли где-нибудь документация по inspect request=child и другим связанным функциям? <br />
			<i>08.11.2022 18:16:00, Larsa.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433156</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433156</guid>
			<pubDate>Tue, 08 Nov 2022 18:16:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433155">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Ещё одним полезным инструментом может быть /console/inspect. Вы можете запросить завершение, список дочерних команд меню и параметры. <br />
			<i>08.11.2022 15:59:00, mrz.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433155</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433155</guid>
			<pubDate>Tue, 08 Nov 2022 15:59:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433154">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Спасибо, @mrz — очень полезно. Особенно для практического создания скинов (потому что /webfig/list вроде бы совпадает со значениями, которые идут в файл «skin»). Но до удобного использования в REST-инструментах типа Postman ему ещё далеко… Тем не менее, полезно: файлы, к которым обращается /webfig/list, на самом деле перечисляют все атрибуты, что удобно. Но вывод из файла JG, похоже, использует именно имена из «Webfig» (логично, учитывая контекст), при этом нигде не указано эквивалентное имя для CLI/REST (например, «DHCP Client» vs. «dhcp-client»), так что для преобразования нужно как-то сопоставлять их. Весь этот процесс — большой проект. Если кому-то поможет, я написал небольшой код на JavaScript для парсинга вывода — поскольку /webfig/list не является современным JSON (но похож на формат «webfig skin JSON»), для разбора нужно использовать eval(). Я с этим дальше ничего не делал, но хотя бы можно более удобно смотреть данные. Либо можно собрать такие данные с разных версий, чтобы сравнить изменения схемы от релиза к релизу.<br /><br />function webfiglist(ip) {<br /> &nbsp;if (typeof window === "object" && !ip) {<br /> &nbsp; &nbsp;ip = (new URL(window.location.href)).host<br /> &nbsp;}<br /> &nbsp;return new Promise((done) =&gt; {<br /> &nbsp; &nbsp;fetch(`http://${ip}/webfig/list`)<br /> &nbsp; &nbsp; &nbsp;.then((req) =&gt; req.text())<br /> &nbsp; &nbsp; &nbsp;.then((txt) =&gt; {<br /> &nbsp; &nbsp; &nbsp; &nbsp;var results = {};<br /> &nbsp; &nbsp; &nbsp; &nbsp;/* это важно... <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /webfig/list — это не валидный JSON, а JS-фрагмент,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; поэтому для преобразования в переменную нужно использовать eval() */<br /> &nbsp; &nbsp; &nbsp; &nbsp;eval(`results = [${txt}]`);<br /> &nbsp; &nbsp; &nbsp; &nbsp;done(results);<br /> &nbsp; &nbsp; &nbsp;});<br /> &nbsp;});<br />}<br /><br />function webfigschemas(ip) {<br /> &nbsp;if (typeof window === "object" && !ip) {<br /> &nbsp; &nbsp;ip = (new URL(window.location.href)).host<br /> &nbsp;}<br /> &nbsp;return webfiglist(ip).then((list) =&gt;<br /> &nbsp; &nbsp;Promise.all(<br /> &nbsp; &nbsp; &nbsp;list<br /> &nbsp; &nbsp; &nbsp; &nbsp;.filter((i) =&gt; i.unique)<br /> &nbsp; &nbsp; &nbsp; &nbsp;.map((i) =&gt; {<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new Promise((done) =&gt; {<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let file = i.name<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fetch(`http://${ip}/webfig/${file}`)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.then((req) =&gt; req.text())<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.then((txt) =&gt; {<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* тот же трюк с eval(), только возвращаем «кортеж» [имя файла, данные] */<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var results<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eval(`results = ${txt}`)<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;done([file, results])<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;})<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;})<br /> &nbsp; &nbsp; &nbsp; &nbsp;})<br /> &nbsp; &nbsp;)<br /> &nbsp;)<br />}<br /><br />webfiglist().then(console.log)<br />webfigschemas().then(console.log)<br /><br />// NODE.JS сохранение в файл<br />// let ip = "192.168.88.1"<br />// const fs = require('fs');<br />// webfigschemas(ip).then(d =&gt; fs.writeFileSync("./webfig-list-schema.json", JSON.stringify(d)))<br /><br />Если вставить этот код в консоль JavaScript в браузере (включив «Inspect» на странице webfig), то в консоли отобразится «датасхема». Если использовать nodeJS, можно передать ip-адрес в webfiglist("192.168.88.1") и получить данные с любого устройства RouterOS (возможно, это получится сделать и в браузере, но для кросс-доменных запросов понадобится настроить проверки безопасности). <br />
			<i>08.11.2022 15:43:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433154</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433154</guid>
			<pubDate>Tue, 08 Nov 2022 15:43:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433153">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Возможно, это будет полезно? Вы можете получить список, вызвав: <noindex><a href="http://ros_adrese/webfig/list" target="_blank" rel="nofollow" >http://ros_adrese/webfig/list</a></noindex> <br />
			<i>01.11.2022 07:32:00, mrz.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433153</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433153</guid>
			<pubDate>Tue, 01 Nov 2022 07:32:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433152">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			+1. Тоже ищу это. Есть какие новости? <br />
			<i>31.10.2022 13:44:00, stevenjacobs.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433152</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433152</guid>
			<pubDate>Mon, 31 Oct 2022 13:44:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433151">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Ты когда-нибудь находил OpenAPI или Swagger-документацию для REST API? Кто-нибудь уже сделал её? <br />
			<i>28.02.2022 17:34:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433151</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433151</guid>
			<pubDate>Mon, 28 Feb 2022 17:34:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Запрос функции: OpenAPI для REST API</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433150">Запрос функции: OpenAPI для REST API</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Привет! Здорово, что для новой бета-версии RouterOS v7 появился REST API. Мы пытаемся внедрить автоматизацию через REST API для RouterOS v7, но столкнулись с тем, что требуется немало усилий, чтобы разобраться в использовании API и сопоставить его с интерфейсом команд. Интересно, можно ли получить спецификацию OpenAPI в формате json, чтобы ускорить разработку для пользователей. Chang <br />
			<i>27.05.2021 08:10:00, sssuperman.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433150</link>
			<guid>http://mikrotik.moscow/forum/forum57/89060-zapros-funktsii_-openapi-dlya-rest-api/message433150</guid>
			<pubDate>Thu, 27 May 2021 08:10:00 +0300</pubDate>
			<category>RouterOS</category>
		</item>
	</channel>
</rss>
