Валидация данных HTTP сервиса с помощью Json Schema на основе OpenAPI

15.05.25

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

Описываю вариант формирования Json Schema из OpenAPI и валидации данных на её основе.

Вводные

Требуется проверить входящие данные в HTTP сервисе в формате JSON. Использование проверки кодом сформированного вручную неудобно.

Наличие описания HTTP сервиса в формате OpenAPI https://spec.openapis.org/oas/v3.1.1.html.

 

 

 

Вариант решения

Получение файла схемы.

В OpenAPI версии 3.1 формат данных приведен к JSON Schema 2020-12

Типы данных в OAS основаны на типах, определённых в проекте спецификации JSON Schema Validation 2020-12: null, булево, объект, массив, число, строка или целое число. Модели определяются с помощью объекта Schema, который является расширенной версией спецификации JSON Schema 2020-12. (https://swagger.io/specification/)

поэтому для формирования схемы только требуется добавить "$schema": "https://json-schema.org/draft/2020-12/schema".

Для упрощения использования описание объектов выделяю в отдельные файлы. Выдержка из корневого файла.

  requestBody:
	content:
	  application/json:
		schema:
		  type: array
		  items:
			$ref: "./Order.yml"

Описание объекта, выдержка (Order.yml)

type: object
properties:
  order_id:
    type: string
    description: Уникальный идентификатор заказа
  created_at:
    type: string
    format: date-time
    description: "Дата создания заказа"
  updated_at:
    type: string
    format: date-time
    description: "Дата обновления заказа"
  header:
    description: "Заголовок заказа"
    type: object
    properties:
      confirmation_method:
        description: "Метод подтверждения заказа"
        type: string
        enum:
          - sms
          - email
          - whatsapp
          - phone
      status:
        description: "Статус заказа"
        type: string
        enum:
          - canceled
          - created

 

Описание в формате YAML. Для преобразования в JSON с добавлением "$schema" использую скрипт (convert.js).

const yaml = require('js-yaml');
const fs = require('fs');

filename = "Order";

// Get document, or throw exception on error
try {
    const doc = yaml.load(fs.readFileSync(`./${filename}.yml`, 'utf8'));
    //console.log(doc);
    doc["$schema"] = "https://json-schema.org/draft/2020-12/schema";
    content = JSON.stringify(doc, null, 2);

    fs.writeFileSync(`./${filename}.json`, content);

} catch (e) {
    console.log(e);
}

Запускаю скрипт

node convert.js

В результате получаю Order.json

{
  "type": "object",
  "properties": {
    "order_id": {
      "type": "string",
      "description": "Уникальный идентификатор заказа"
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Дата создания заказа"
    },
...
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

 

Валидация используя схему

Для валидации использую внешнюю компоненту https://github.com/Toveal/jsonschema-1c

Схему поместил в макет.

Модуль проверки изменил под свою задачу

	СхемаЗаказ = ПолучитьОбщийМакет("Заказ_Схема").ПолучитьТекст();
	
	ТелоЗаказ = КоннекторHTTP.ОбъектВJson(СтруктураЗаказ);
	
	БуферОшибок = ПроверитьТелоЗапроса(ТелоЗаказ, СхемаЗаказ, Отказ);
	
	Если БуферОшибок <> Неопределено Тогда
		Отказ = Истина;
		СтруктураОтвет.Вставить("errors", КоннекторHTTP.JsonВОбъект(БуферОшибок));	
	ИначеЕсли Отказ Тогда
		МассивОшибок = Новый Массив;
		МассивОшибок.Добавить("Ошибка валидатора JSON");
		СтруктураОтвет.Вставить("errors", МассивОшибок);	
	КонецЕсли;

...

Функция ПроверитьТелоЗапроса(ТелоЗаказ, СхемаЗаказ, Отказ = Ложь) Экспорт

	БуферОшибок = Неопределено;
	
	КомпонентаПодключена = ПодключитьВнешнююКомпоненту(ПутьККомпоненте(), "JsonСхема",
		ТипВнешнейКомпоненты.Native, ТипПодключенияВнешнейКомпоненты.НеИзолированно);

		Если Не КомпонентаПодключена Тогда
			Отказ = Истина;
		Возврат БуферОшибок;
	КонецЕсли;

	КомпонентаОбъект = Новый ("AddIn.JsonСхема.JsonSchema1C");

		// Отключение доп. форматов
	КомпонентаОбъект.ИспользоватьДопФорматы = Ложь;

	// Установка основной схемы
	Попытка
		КомпонентаОбъект.УстановитьОсновнуюСхему(СхемаЗаказ);
	Исключение
	    Сообщить(КомпонентаОбъект.ПолучитьПоследнююОшибку());
		Отказ = Истина;
		Возврат БуферОшибок;
	КонецПопытки;

	// Установка формата вывода
	КомпонентаОбъект.Формат = "Ошибка: {error}, в: {path}";

	// Подробная проверка
	// Буфер в любом случае будет преобразован в строку
	Попытка
		Действителен = КомпонентаОбъект.Проверить(ТелоЗаказ, БуферОшибок);
	Исключение
		Сообщить(КомпонентаОбъект.ПолучитьПоследнююОшибку());
		Отказ = Истина;
	КонецПопытки;

	Возврат БуферОшибок;

КонецФункции

 

Результат

Без дополнительного кода получил проверку входящих данных по актуальной версии схемы.

Для изменения валидатора нужно только поправить и сконвертировать описание сервиса.

Схема упрощенная, как использовать вложенные объекты ("$ref:") нужно разобраться.

Генераторы для приложений https://openapi-generator.tech/docs/generators не пользуют схему, а конвертируют в код на целевом языке с учетом фреймворка.

Схема OpenAPI схожа со схемой AsyncAPI https://www.asyncapi.com/docs/tutorials/getting-started/coming-from-openapi, и ту же схему можно применять при валидации для асинхронных обменов.

 

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

OpenAPI JSON Schema валидация

См. также

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

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

128000 руб.

19.12.2023    5448    4    0    

12

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

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

60000 руб.

07.05.2019    36369    71    45    

30

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

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

36000 руб.

03.08.2020    20014    26    24    

22

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

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

57600 руб.

26.11.2024    3822    3    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    1679    11    2    

12

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

Решение осуществляет синхронизацию задач Битрикс24 и 1С, что позволяет в одной системе ставить задачи, контролировать выполнение всего пула задач с группировкой по ответственным и проектам, формировать управленческие отчеты по работе сотрудников (загрузка, просроченные задачи), уведомлять сотрудников о ходе выполнения задач посредством чат-бот Telegram

7200 руб.

04.05.2021    21636    14    19    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. rambomax 21 19.05.25 08:10 Сейчас в теме
Насколько я понимаю суть процесса, для валидации нужно отдать свой заказ со всеми данными в заказе стороннему очень честному сервису, который не будет запоминать данные по моим клиентам, их заказам и не будет торговать их персональными данными.
Впервые вижу, чтобы в 21 веке добровольно отдавали своих клиентов - это что-то абсолютно новое. Раньше ни одной буквы сведений, составляющих коммерческую тайну, никому не передавали, более того, даже соединение шифровали, чтобы никто перехватить не мог. А теперь количество клиентов, состав заказов, частота транзакций - всё само)))
Возможно, кому-нибудь будет не лень проанализировать состав заказа, тут же отправить ответ ошибки валидации, отказ от заказа, а на присланную почту отправить ссылку на правильный магазин, созданный заказ с таким же составом и на 100 рублей дешевле.
2. simy4 34 19.05.25 16:24 Сейчас в теме
(1) Не совсем понятно, как вы пришли к такому выводу? Для валидации используется внешняя компонента (а не внешний сервис). Может быть вы успели проанализировать исходный код компоненты и нашли там использование внешних сервисов? Я не поленился проанализировать исходники и никакой передачи данных валидируемого файла там не обнаружил. Потрудитесь пожалуйста укрепить вашу позицию основательнее, желательно погрузившись в технические детали.
3. rambomax 21 19.05.25 17:39 Сейчас в теме
(2) Для валидации используется по-определению сторонняя программная компонента, которая берётся "из открытого доступа" и ей скармливается конфиденциальная информация. В качестве обоснования такого действия приводится "делать самому неудобно". Вне зависимости какой код _сейчас_ интересно будет какой код окажется там _потом_ или насколько двоичный код отличается от "исходного")))
Потому что всем давно известно, что далеко-далеко в альпийских горах живут честные гномики, которые бесплатно валидируют чужие заказы и делают вкусный молочный шоколад.
4. simy4 34 21.05.25 15:58 Сейчас в теме
(3) Ваша желчность неуместна, к тому же, вы упорно натягиваете сову на глобус.

Разберемся же с вашими тезисами.

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

“Ей скармливается конфиденциальная информация” - всё происходит локально. Компонента не выполняет никаких сетевых запросов, не взаимодействует с внешними API, не имеет встроенной логики телеметрии или логгирования. Если вы так переживаете за сохранение конфиденциальности данных, направьте ваши усилия на изолирование среды, в которой работает 1С.

"А вдруг код изменится потом?” - это контролируется. Репозиторий на GitHub сохраняет историю изменений, которую можно отслеживать. В продакшн среду вы поставляете определённую версию, собранную из конкретного коммита (удивительно, что приходится это разжевывать).

“Возможно, бинарь отличается от исходников” - легко проверяется. Rust, используемый в проекте, обеспечивает детерминированную сборку (при правильной настройке). Соберите версию компоненты из исходников, сравните SHA256-суммы своего бинарника и опубликованного. Это не проблема доверия, а вопрос прозрачной и проверяемой практики.

"Самому делать неудобно - плохое обоснование” - это экономическая реальность. Использование внешних, хорошо реализованных библиотек - это нормальная инженерная практика. Признак не лени, а зрелости. А вы, по всей видимости, из тех любителей клепать велосипеды на чужие деньги. С таким подходом вас ИИ заменит в первых рядах, очнитесь :)


В целом, спасибо вам за ответ. Прекрасно продемонстрировали прописную истину: критикуешь - сначала сам разберись в вопросе.
5. rambomax 21 21.05.25 16:53 Сейчас в теме
(4) Огромное спасибо за развёрнутый комментарий. Нас действительно долго приучали верить в "демократиюЪ, свободуЪ, открытостьЪ" и прочие "инструменты белых господ для стран третьего мира".
Скармливать 1С определённого рода информацию намного лучше: есть сертификаты, подтверждающие безопасность такого рода действий. Есть "компоненты", которые "подписаны ЭЦП" и, таким образом, гарантируют, что есть конкретные люди, которые проверяли функционал.
В вашем окружении нет людей, которые отвечают за "безопасность", поэтому вы легко в "продакшн среду поставляете определённую версию, собранную из конкретного коммита" (удивительно, что приходится это разжевывать).
Как только в вашем окружении появятся люди, которые со спокойным взглядом холодных серых глаз зададут вам вопрос: гарантируете ли лично вы вашим имуществом и здоровьем качество найденного на "бесплатной" свалке "бесплатного" кода: а) сейчас; б) завтра; в) через месяц; г) через год - возможно ваши взгляды на бесплатные дары из общих ресурсов поменяются (бесплатный код он известно где))).
Использование внешних _проверенных и сертифицированных_ библиотек - вот это признак зрелости.
А вера в качество бесплатного кода это признак недостаточной взрослости мышления.
И вдогонку - бредогенератор, фильтрующий по критериям из словесного мусора какие-то слова, называемый "большая ЯЗЫКОВАЯ модель", или в просторечье "ии", может заменить только тех, кто "рот закрыл - рабочее место убрал". А программы пишут совсем-совсем по-другому)))
6. fatman78 21 29.05.25 20:27 Сейчас в теме
(5) Вас никто не заставляет пользоваться опенсорсом. Но и голословно поливать грязью компоненту с открытым исходным кодом используя фразы
бесплатный код он известно где
и называть githab
"бесплатной" свалке "бесплатного" кода
ума много не надо. Никто не запрещает провести аудит кода перед использованием или написать свою компоненту (кому что быстрее).
Оставьте свое сообщение