Валидация JSON через OpenAPI: как находить сломанные API-ответы через apivalidator.ru
Согласитесь, было бы удобно иметь простой инструмент, который позволяет:
- загрузить Swagger
- подставить реальный API-ответ
и сразу понять:
- валиден ли он
- и если нет — то почему Вот он — apivalidator.ru.
Простой сервис, который помогает быстро проверить, соответствует ли реальный ответ API его спецификации, и сразу показывает, где именно возникает проблема.
Недавно один мой товарищ рассказал о проблеме, которую он сейчас решает. В свое время я сам сталкивался с такой. Честно говоря, думал, что такие вещи уже остались в прошлом — но, как оказалось, нет. Несколько лет назад в одной крупной компании у нас была такая же довольно типичная, но крайне неприятная ситуация.
Бэкенд представлял собой большой легаси-монолит, почти полностью написанный на PHP. А PHP, как известно, язык с нестрогой типизацией — и пока всё остаётся внутри него, это обычно не вызывает серьёзных проблем. Сложности начались в тот момент, когда фронты стали переходить на новые сетевые движки, основанные на кодогенерации из Swagger.
И именно тогда проявилась проблема, которая раньше просто не была заметна. Из-за нестрогой типизации одни и те же данные могли приходить в разных форматах. Например, числовое поле могло быть как числом, так и строкой (“12345”). С булевыми значениями ситуация была ещё интереснее. Один и тот же флаг мог приходить в нескольких вариантах:
- “true” / “false”
- “1” / “0”
- 1 / 0
- true / false
На прежнем сетевом движке это «работало»: значения просто пытались привести к нужному типу, пока не получалось. Проблема в том, что таким образом ошибки не исправлялись, а тихо маскировались.
Но с переходом на новый движок:
- объекты переставали десериализоваться
- падал декодинг
- в некоторых случаях ломался весь JSON-ответ
- клиентские приложения просто переставали работать
Со временем мы начали постепенно приводить бэкенд в порядок:
- фиксировали типы
- устраняли неоднозначности
- договаривались о контрактах
Однако оставалась одна неприятная деталь. Представим, что API возвращает массив из 100 объектов: 99 из них корректны, 1 — нет. И этого достаточно, чтобы сломать всё.
Особенно неприятно, если это происходит, например, на главной странице: интерфейс не загружается, появляются ошибки, пользователь не получает никакой внятной обратной связи. В такой ситуации пользователю неважно, какой именно объект оказался некорректным — он просто закрывает страницу. А QA, конечно же, заводит срочный баг на фронт (потому что «ничего не работает»)
В какой-то момент стало очевидно, что не хватает простого инструмента, который позволял бы: — взять спецификацию API — взять реальный ответ сервера — и быстро проверить их на соответствие С понятным ответом: где именно возникает проблема и почему.