Как сделать что бы сваггер авторизовывался

Добавил пользователь Дмитрий К.
Обновлено: 16.09.2024

При проектировании современных программных систем часто встает задача согласования и разработки интерфейсов для взаимодействия их компонентов друг с другом.

В последнее десятилетие огромную популярность и развитие получили SPA и thick мобильные приложения взаимодействующие с сервером через API интерфейсы.

Если раньше разработка интерактивного веб сайта происходила путем поэтапных правок кода серверной стороны для генерации HTML разметки с ее последующей передачей браузеру клиента, то теперь разработка динамических веб приложений сместилась в сторону создания единого API сервиса и параллельной разработки множества приложений (в том числе и SPA) работающих с этим API как с главным источником данных.

Такой подход позволяет более удобно разделять задачи, организовывать команды, специализирующиеся только на конкретных технологиях (привлекать более узконаправленных специалистов), организовать параллельную разработку на самых первых этапах, а также позволяет создать единую точку коммуникации — API интерфейс.

Такая единая точка коммуникации требует формального и однозначного определения, этим документом является API спецификация.

В некоторых случаях необходимо также знать также формат тела запроса. Обычно реализация REST интерфейса базируется на общих принципах и традициях, принятых в вашей организации.

В любом случае, REST endpoints всегда должны быть описаны в одном конкретном документе, доступном для всех остальных разработчиков.

Доменные модели прикладной области не обязательно должны совпадать с моделями, описанными в API-спецификации. Их возможные намеренные совпадения со структурами классов в коде клиентских приложений или со структурами схем БД вводятся скорее для упрощения процесса разработки.

Документацию должно быть легко читать, писать, парсить, генерировать, исправлять, обновлять и прочее.

Swagger — это фреймворк и спецификация для определения REST APIs в формате, дружественном к пользователю и компьютеру (в нашем случае JSON или YAML). Позже переименовался в OpenApi, но все продолжают использовать термин сваггер.

Пример документации swagger

Но Swagger — это не просто спецификация. Основная его мощь заключается в дополнительных инструментах, вот некоторые примеры:

  • swagger ui — на скрине выше. позволяет в наглядном виде просматривать документацию, отправлять запросы и получать реальные ответы.
  • swagger-online — онлайн-редактор, wysiwyg — позволяет генерировать документацию по комментариям из кода (например, к контроллерам и моделям)

Как это работает:

У каждого сервиса в определенной папке лежит файл со Swagger описанием и хранится это все прямо в git-репозитории. Описания могут быть как сгенерированы при помощи Swagger generator, так и записаны туда вручную.

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

Плюс имеем версионирование документации по релизам приложения.

Поскольку каждый микросервис предоставляет собственную документацию, мы можем настроить специальную задачу для Дженкинса (или любого другого CI сервера), которая сгенерирует полную документацию для всего проекта.
Эта задача собирает Swagger файлы из всех микросервисов, производит некоторые минимальные модификации (дедупликация, удаление ненужных атрибутов) и на выходе генерирует единый Swagger файл, содержащий полную актуальную информацию для всего проекта.

скрин

Централизованное хранение и редактирование документации — это только первый шаг. Следующий — сделать ее доступной для всех разработчиков, тестеров и остальных заинтересованных людей в компании. И Swagger UI — это именно то, что вам для этого понадобится. При помощи небольшой JavaScript библиотеки Swagger UI генерирует HTML элементы для всех ваших REST endpoints, которые далее можно упорядочивать с помощью HTML разметки.

Альтернативы:

API Blueprint

RESTful API Modeling Language (RAML)



Заключение

Плюсы swagger:

  • единая точка правды для всей команды
  • фронтенд и бекенд могут выполняться параллельно, не ожидая друг друга и ориентируясь лишь на документацию
  • автоматизация и тесты: при выполнении можно сверяться с документацией и выдавать ошибки в случае расхождений
  • при быстрой разработке, когда сразу пишется код прототипа, есть возможность создавать документацию на ходу, описывая её в комментариях методов в DocBlock
  • версионирование документации
  • большая экосистема, позволяющая найти решение для любого языка программирования
  • Понятный и легко читаемый язык описания
  • Условно бесплатный хаб для спецификаций;
  • Подробная официальная документация;
  • Низкий порог вхождения.

Минусы:

Просто цитата

Простота венчает оба конца на шкале артистизма… Непросвещённый абориген облекает простую идею в бесхитростную форму и творит красоту. А искушённый критик отвергает чрезмерную изощрённость и красивость ради чистой подлинности незатейливого искусства.

Всем привет. Это мой первый пост на Хабре и я хочу поделиться с вами своим опытом в исследование нового для себя фреймворка.

Мне предоставился момент выбрать тему и подготовить презентацию для своей команды. Вдохновившись спикером Евгений Маренков, я решил выбрать данную тему. В процессе подготовки, я облазил много статей и репозиториев что бы компактно и эффективно донести нужную информацию.

Сейчас хочу поделиться ею в надежде, что кому-то она поможет в изучение Swagger (OpenApi 3.0)

Введение

Я на 99% уверен у многих из вас были проблемы с поиском документации для нужного вам контроллера. Многие если и находили ее быстро, но в конечном итоге оказывалось что она работает не так как описано в документации, либо вообще его уже нет.
Сегодня я вам докажу, что есть способы поддерживать документацию в актуальном виде и в этом мне будет помогать Open Source framework от компании SmartBear под названием Swagger, а с 2016 года он получил новое обновление и стал называться OpenAPI Specification.

Swagger - это фреймворк для спецификации RESTful API. Его прелесть заключается в том, что он дает возможность не только интерактивно просматривать спецификацию, но и отправлять запросы – так называемый Swagger UI.

Также возможно сгенерировать непосредственно клиента или сервер по спецификации API Swagger, для этого понадобиться Swagger Codegen.

Основные подходы

Swagger имеет два подхода к написанию документации:

Документация пишется на основании вашего кода.

Данный подход позиционируется как "очень просто". Нам достаточно добавить несколько зависимостей в проект, добавить конфигурацию и уже мы будем иметь нужную документацию, хоть и не настолько описанной какою мы хотели.

Код проекта становиться не очень читабельным от обилия аннотаций и описания в них.

Вся документация будет вписана в нашем коде (все контроллеры и модели превращаются в некий Java Swagger Code)

Подход не советуют использовать, если есть возможности, но его очень просто интегрировать.

Документация пишется отдельно от кода.

Данный подход требует знать синтаксис Swagger Specification.

Документация пишется либо в JAML/JSON файле, либо в редакторе Swagger Editor.

Swagger Tools

Swagger или OpenAPI framework состоит из 4 основных компонентов:

Swagger Core - позволяет генерировать документацию на основе существующего кода основываясь на Java Annotation.

Swagger Codegen - позволит генерировать клиентов для существующей документации.

Swagger UI - красивый интерфейс, который представляет документацию. Дает возможность просмотреть какие типы запросов есть, описание моделей и их типов данных.

Swagger Editor - Позволяет писать документацию в YAML или JSON формата.

Теперь давайте поговорим о каждом компоненте отдельно.

Swagger Core

Swagger Code - это Java-реализация спецификации OpenAPI

Для того что бы использовать Swagger Core во все орудие, требуется:

Java 8 или больше

Apache Maven 3.0.3 или больше

Jackson 2.4.5 или больше

Что бы внедрить его в проект, достаточно добавить две зависимости:

Также можно настроить maven плагин, что бы наша документация при сборке проект генерировалсь в YAML

Дальше нам необходимо добавить конфиг в проект.

Для конфигурации Swagger необходимо добавить два бина. Где нам нужно будет описать название приложения, версию нашего API, так же можно добавить контакт разработчик который отвечает за данные API

После добавление нужных нам зависимостей, у нас появятся новые аннотация с помощью которых можно документировать наш код.

Вот некоторые из них:

@Parameter - Представляет один параметр в операции OpenAPI.

@RequestBody - Представляет тело запроса в операции

@ApiResponse - Представляет ответ в операции

@Tag - Представляет теги для операции или определения OpenAPI.

@Server - Представляет серверы для операции или для определения OpenAPI.

@Callback - Описывает набор запросов

@Link - Представляет возможную ссылку времени разработки для ответа.

@Schema - Позволяет определять входные и выходные данные.

@ArraySchema - Позволяет определять входные и выходные данные для типов массивов.

@Content - Предоставляет схему и примеры для определенного типа мультимедиа.

@Hidden - Скрывает ресурс, операцию или свойство

Swagger Codegen

Swagger Codegen - это проект, который позволяет автоматически создавать клиентские библиотеки API (создание SDK), заглушки сервера и документацию с учетом спецификации OpenAPI.

В настоящее время поддерживаются следующие языки / фреймворки:

Node.js (ES5, ES6, AngularJS with Google Closure Compiler annotations)

C++ (cpprest, Qt5, Tizen)

Java (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework, PKMST)

C++ (Pistache, Restbed)

PHP (Lumen, Slim, Silex, Symfony, Zend Expressive)

Ruby (Sinatra, Rails5)

Scala (Finch, Lagom, Scalatra)

API documentation generators:

Что бы внедрить его в проект, достаточно добавить зависимость, если используете Swagger:

и если используете OpenApi 3.0, то:

Можно настроить maven плагин, и уже на процессе сборки мы можем сгенерировать нужный для нас клиент либо мок сервиса.

Также все это можно выполнить с помощью командной строки.

Запустив джарник codegen и задав команду help можно увидеть команды, которые предоставляет нам Swagger Codegen:

config-help - Справка по настройке для выбранного языка

generate - Сгенерировать код с указанным генератором

help - Отображение справочной информации об openapi-generator

list - Перечисляет доступные генераторы

meta - Генератор для создания нового набора шаблонов и конфигурации для Codegen. Вывод будет основан на указанном вами языке и будет включать шаблоны по умолчанию.

validate - Проверить спецификацию

version - Показать информацию о версии, используемую в инструментах

Для нас самые нужные команды это validate, которая быстро проверять на валидность спецификации и generate, с помощью которой мы можем сгенерировать Client на языке Java

java -jar openapi-generator-cli-4.3.1.jar validate -i openapi.yaml

java -jar openapi-generator-cli-4.3.1.jar generate -i openapi.yaml -g java --library jersey2 -o client-gener-new

Swagger UI

Swagger UI - позволяет визуализировать ресурсы API и взаимодействовать с ними без какой-либо логики реализации. Он автоматически генерируется из вашей спецификации OpenAPI (ранее известной как Swagger), а визуальная документация упрощает внутреннюю реализацию и использование на стороне клиента.

Вот пример Swagger UI который визуализирует документацию для моего pet-project:



Нажавши на кнопку "Try it out", мы можем выполнить запрос за сервер и получить ответ от него:


Swagger Editor

Swagger Editor - позволяет редактировать спецификации Swagger API в YAML внутри вашего браузера и просматривать документацию в режиме реального времени. Затем можно сгенерировать допустимые описания Swagger JSON и использовать их с полным набором инструментов Swagger (генерация кода, документация и т. Д.).

На верхнем уровне в спецификации OpenAPI 3.0 существует восемь объектов. Внутри этих верхнеуровневых объектов есть много вложенных объектов, но на верхнем уровне есть только следующие объекты:

Для работы над документацией со спецификацией используется онлайн-редактор Swagger Редактор Swagger имеет разделенное представление: слева пишем код спецификации, а справа видим полнофункциональный дисплей Swagger UI. Можно даже отправлять запросы из интерфейса Swagger в этом редакторе.

Редактор Swagger проверит контент в режиме реального времени, и укажет ошибки валидации, во время кодирования документа спецификации. Не стоит беспокоиться об ошибках, если отсутствуют X-метки в коде, над которым идет работа.

Первым и важным свойством для документации это openapi. В объекте указывается версия спецификации OpenAPI. Для Swagger спецификации это свойство будет swagger:

Объект info содержит основную информацию о вашем API,включая заголовок, описание, версию, ссылку на лицензию, ссылку на обслуживания и контактную информацию. Многие из этих свойство являются не обязательными.

Объект servers указывает базовый путь, используемый в ваших запросах API. Базовый путь - это часть URL, которая находится перед конечной точкой. Объект servers обладает гибкой настройкой. Можно указать несколько URL-адресов:

paths - Это та же “конечная точка” в соответствии с терминологии спецификации OpenAPI. Каждый объект path содержит объект operations - это методы GET, POST, PUT, DELETE:

Объект components уникален среди других объектов в спецификации OpenAPI. В components хранятся переиспользуемые определения, которые могут появляться в нескольких местах в документе спецификации. В нашем сценарии документации API мы будем хранить детали для объектов parameters и responses в объекте components

Conclusions

Документация стала более понятней для бизнес юзера так и для техническим юзерам (Swagger UI, Open Specifiation)

Можно проверять насколько совместимы изменения. Можно настраивать это в дженкинсе

Нет ни какой лишней документации к коде, код отдельно, документация отдельно

В этой статье поговорим о Swagger (Свагере) и Wrappers (Обертки).

Сваггер упрощает написание API для пользователей, команд и больших компаний с помощью своих инструментов. Подробнее можете почитать здесь.

Под обертками я понимаю программы, которые оборачивают REST API и позволяют разработчику использовать этот REST API в более удобном виде.

Например, можно посмотреть на вот такие обертки для Jira: jiraclient (обертка для работы с REST API Jira через JavaScript), питоновский клиент Jira .

Зачем нам нужны обертки?

Я буду рассказывать про обертки и сваггер в контексте продуктов Atlassian, но все эти же идет могут быть применены и для других продуктов.

Обертки позволяют нам работать с REST API легче. Например, давайте воспользуемся нашей JS оберткой, чтобы получить данные для запроса:

Как вы видите, мы сначала инициализировали подключение к Jira, а затем воспользовались методом findIssue, чтобы получить данные по запросу. Мы написали мало строчек кода, что сделало наш код понятнее и менее бажным.

Тоже самое для питоновской библиотеки:

Опять инициализировали подлкючение и вызвали метод jql. Очень простой и понятный код.

Я думаю, теперь понятно для чего нужны обертки.

Тогда зачем Сваггер?

Обертки широко использовались до появления Сваггера.

Сваггер позволяет описать API в определенной нотации и клиенты Сваггера смогут прочитать это описание и сгенерировать код для выполнения этого API.

Я сделаю детальный пример в этой статье.

Я доработаю плагин jira-react-atlaskit, который я сделал для того, чтобы показать, как использовать React и Atlaskit в серверных плагинах.

Я добавлю туда код, который будет выбирать все проекты из Jira Cloud с помощью swagger-js.

В реальном приложении я не делал бы это через фронтенд, а использовал бы бэкенд, который написан на Java. В этом случае я бы использовал библиотеку swagger-codegen. Это бы сделало наше приложение более безопасным.

Но в рамках этой статьи я все буду делать на фронтенде.

Меняем бэкенд

Как я сказал выше, чтобы клиенты сваггера могли работать, им нужно подать файл в нотации сваггер. Atlassian это для нас сделал вот здесь.

Вам нужно скачать этот файл и поменять параметр servers:

Замените url на url Вашего Jira Cloud.

Далее нам нужно сделать этот файл доступным в моем Jira Server плагине. Поэтому я его положил в папку backend/src/main/resources/swagger. Имя файл swagger.v3.json.

Далее я добавил ссылку на него в дескрипторе web-resource в файле atlassian-plugin.xml:

Теперь мне нужно передать путь к файлу в мой JS код.

Для этого я добавлю параметер с этим путем для передачи в мой шаблон soy в файле backend/src/main/java/ru/matveev/alexey/atlas/jira/servlet/FormServlet.java

И прочитаю этот параметр в моем файле soy.

Отлично! Бэкенд готов.

Меняем фронтенд

Сначала добавим зависимость на библиотеку swagger-js в файл frontend/package.json:

Теперь будем менять код в файле frontend/src/js/components/Form.js.

Сначала импортируем сваггер клиента:

А теперь поменяем наш конструктор.

Получаем путь на файл swagger.v3.json:

А теперь пишем код по получению всех проектов:

Как я сказал, в реальности мы должны все делать на бэкенде, но я сделал на фронте, поэтому я запущу Chrome с отключенной веб безопасностью.

Теперь открываю мою форму и вижу в консоли вот такие данные:

Это все мои проекты с Jira Cloud.

Мы написали всего лишь несколько строк кода, чтобы получить эти данные.

Вы можете посмотреть все доступные методы вот так:

Если опять откроете форму, то в консоли будет вот такое:

Это список всех доступных для вызова методов.

Заключение

Как Вы видите, мы пишем примерно одинаковое количество кода с обертками и сваггером. Тогда зачем использовать сваггер?

  1. Разработчики продукта обновят сваггер файлы для своих API быстрее, чем разработчики оберток допилят их продукт. Кроме того, разработчики оберток совсем могут забросить их продукт. Зачем им тратить свое время на написание кода, который можно получить ничего не делая?
  2. Если Вы используете Сваггер клиента, то Вы можете использовать этого клиента не только для работы с Jira, но и для работы с любым другим продуктом, поддерживающим Сваггер. В этом случае Вы не тратите время на поиск оберток и изучение работы с ними для других продуктов

Поэтому необходимость оберток значительно снизилась после появления Сваггера. Да, имеем смысл использовать обертки, которые дают какие-то преимущества перед генерируемым клиентами Сваггер кодом. Но таких оберток мало. Их нужно еще поискать и не факт, чтоб Вы найдете его для Вашего продукта. По крайней мере такие обертки для продуктов Atlassian мне неизвестны.

Вы можете посмотреть финальный код здесь.

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Визуализатор

Документация основывается на JSON-схеме. Есть пример кода статичной документации с четырьмя файлами. В общем же случае надо скачать .zip архив последней стабильной ветки Swagger-UI, либо делать чекаут мастера. Визуализатор написан на coffee script + backbone.js

Поскольку документация подразумевается динамической, то и генерироваться она должна из кода с аннотациями, а не переписываться каждый раз. В отличие от docblox и прочих документаций, эта расчитана именно на серверное взаимодействие с GET, POST, PUT и DELETE методами и сама позволяет эмулировать запросы.

swagger_screenshot

Схема

Описание всех доступных файлов поставляется в resources.json, который ссылается на остальные файлы за деталями..

Сам файл с детальным описанием повторяет то что в resources.json, только теперь со всем списком методов=операций и используемыми входными параметрами..

Генератор

Стабильные генераторы написаны в основном для java (в т.ч. для Play! фреймворка), scala и node.js. Не густо. Для php есть три независимых библиотеки которые как-то позволяют генерировать JSON-схему для визуализации. Ключевое слово как-то.

    PHP Composer Bundle PHP framework, swagger support planned in 3.0

Я выбрал первую.. устанавливается легко.

Первая проблема — при запуске генерации json’а на основе аннотаций вылезли баги — сначала что -e (exclude) флага нехватало, потом что require не работает. А работает он так, что инклудит подряд все файлы и начинает с них читать, поэтому если вы инклудите файл с помощью констант каких-то, то он тут же рухнет. Поэтому он должен проходится по чистым классам-контроллерам и на основе них всё дампить.

php swagger.phar -p ../my_api/ -o ../my_api/doc_json/ -e ../index.php -f

С этой коммандой, в папке doc_json появятся результаты.

Вторая проблема в том как эти результаты подключить к Swagger UI. Дело в том, что обычно json файлы можно генерировать и в корень API, но тогда с Апачем возникает проблема, что не работает mod_rewrite. Во всяком случае у меня. Ведь мне надо что-бы скажем /comment/findByName/ перезаписывалось в index.php.

Апач же настырно находит comment.json и пытается у файла найти подпапки и падает. Идиотизм конечно, но я ни с какими флагами -F не смог его образумить. Поэтому всё пускаю через index.php. Даже выдачу этих json файлов. Конечно, если у вас сам API называется comment.json то тут уже сложно что придумать.

Схема описанная выше генерируется из аннотаций — resource.php на основе комментария к классу..

А API на основе комментариев к методам..

Модели

Параметры на выходе (return) для каждого метода прописываются в поле responseClass. Это фактически ссылка на возвращаемый тип данных, который может быть примитивом — строкой, числом и тп, либо составным классом. Эти классы описываются в свою очередь в поле models.

Модели аналогично объявляются в swagger-php..

Как регламентировать перекуры в течение рабочего дня? Можно ли разрешать опаздывать к началу рабочего дня? Можно ли чатится во время…

Вам нравится, когда у маркетинга и продаж развязаны руки? Когда они жгут по полной и продажи прут? Когда целевая аудитория…

У каждого из нас в жизни наступает такой момент, когда мы говорим себе, всё, хватит, надоел мне босс, надоел этот…

Читайте также: