Валидация данных 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С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

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

36000 руб.

03.08.2020    21777    31    24    

25

SALE! 15%

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

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

17280 14688 руб.

20.12.2024    3999    20    2    

21

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    8668    7    5    

9

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

Обмен данными с "Порталом поставщиков" zakupki.mos.ru Москвы и Московской области с целью создания оферт для закупок государственными учреждениями. Модуль устраняет рутину, минимизирует ошибки и помогает выигрывать больше закупок. Работает строго по требованиям 44-ФЗ.

14400 руб.

13.12.2016    41298    54    39    

37

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

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

5196 руб.

28.04.2016    98225    111    218    

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

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

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

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

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

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

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


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