Для взаимодействия с любой программой используется API. Он может быть закрытым для внешнего взаимодействия или открытым. В любом случае разработчикам следует уделять внимание его спецификации. Это в том числе нужно для того, чтобы новые члены команды быстрее и проще вовлекались в проект.
Ручное формирование документации — утомительное занятие. Поэтому разработчики придумали Swagger. С его помощью на основе кода можно автоматически сгенерировать спецификации API.
Содержание статьи:
Что такое Swagger
Основные подходы
Swagger Core
Swagger Codegen
Swagger UI
Swagger Editor
Использование Petstore для знакомства
Авторизация
Создание запроса
Проверка результата
Как выглядят сайты с документацией Swagger UI
Как встроить Swagger UI в существующий сайт
Заключение
Swagger — это набор инструментов, которые помогают описывать API. Благодаря ему пользователи и машины лучше понимают возможности REST API без доступа к коду. С помощью Swagger можно быстро создать документацию и отправить ее другим разработчикам или клиентам.
В 2015 году проект Swagger сделали открытым и передали OpenAPI Initiative. Теперь сама спецификация называется OpenAPI. Swagger — инструментарий для работы с OpenAPI, название которого используется в коммерческих и некоммерческих продуктах. Если кто-то называет саму спецификацию Swagger, то это не совсем верно.
Документ спецификации OpenAPI использует YAML, но также может быть написан в формате JSON. Сам по себе он является объектом JSON.
Получить высокий уровень знаний в разработке, можно закончив курсы наших партнеров школы Mate Academy. Менторство у практикующих экспертов и индивидуальный подход выведут вас на высокий профессиональный уровень.
Swagger предлагает два основных подхода к генерированию документации:
Первый подход проще. Мы добавляем зависимости в проект, конфигурируем настройки и получаем документацию. Сам код из-за этого может стать менее читабельным, документация тоже не будет идеальной. Но задача минимум решена — код задокументирован.
Чтобы пользоваться вторым подходом, нужно знать синтаксис Swagger. Описания можно готовить в формате YAML/JSON. Можно упростить эту задачу, используя Swagger Editor. Конечно, второй подход позволяет сделать документацию более качественной и кастомной для каждого конкретного проекта и его особенностей, к тому же все не так сложно как может показаться, это потребует минимальных дополнительных усилий.
Это Java-реализация спецификации. Для ее использования потребуется:
Для его внедрения в проект используются две зависимости. Вот примеры:
<dependency> <groupId>io.swagger.core.v3</groupId> <artifactId>swagger-annotations</artifactId> <version>2.1.11</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.5.2</version> </dependency>
Другой способ — настроить maven-плагин. Тогда описания при сборке проекта будут генерироваться в файл YAML. Пример:
<plugin> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-maven-plugin</artifactId> <version>0.3</version> <executions> <execution> <phase>integration-test</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <apiDocsUrl>http://localhost:3080/v3/api-docs</apiDocsUrl> <outputFileName>openapi.yaml</outputFileName> <outputDir>${project.build.directory}</outputDir> </configuration> </plugin>
Для конфигурации нужны еще два бина (beans). В них мы описываем название приложения, версию API, добавляем другие важные данные. Посмотреть примеры можно в этом репозитории на GitHub. В нем представлены образцы Swagger Core из библиотеки Java. Каждый образец содержит файл Readme
, в котором подробно описано, как его запускать и что проверять.
После настройки конфигурации мы получим аннотации, которые можно использовать для документирования кода.
Аннотация | Использование |
@Operation | Для описания операции или метода HTTP |
@Parameter | Для представления одного параметра в операции |
@RequestBody | Для представления тела запроса в операции |
@ApiResponse | Для представления тела ответа в операции |
@Tag | Для представления тегов операции или определения OpenAPI |
@Server | Для представления серверов операции или определения OpenAPI |
@Callback | Для описания набора запросов |
@Link | Для представления ссылки времени разработки для ответа |
@Schema | Для определения входных и выходных данных |
@ArraySchema | Для определения входных и выходных данных для типов массивов |
@Content | Для представления схемы и примеров для мультимедиа |
@Hidden | Для скрытия ресурса, операции или свойства |
Это проект для автоматического генерирования клиентских библиотек API, заглушек сервера и документации. Поддерживает большое количество технологий. Посмотреть полный список можно в репозитории Swagger Codegen на GitHub.
В этом же репозитории вы найдёте примеры того, как можно генерировать документацию, используя различные шаблоны.
API клиенты | ActionScript, Ada, Apex, Bash, C#, C++, Clojure, Dart, Elixir, Elm, Eiffel, Erlang, Go, Groovy, Haskell, Java (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java, Rest-assured), Kotlin, Lua, Node.js, Objective-C, Perl, PHP, PowerShell, Python, R, Ruby, Rust (rust, rust-server), Scala (akka, http4s, swagger-async-httpclient), Swift (2.x, 3.x, 4.x, 5.x), Typescript |
Заглушки | Ada, C# (ASP.NET Core, NancyFx), C++ (Pistache, Restbed), Erlang, Go, Haskell (Servant), Java (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework, PKMST), Kotlin, PHP (Lumen, Slim, Silex, Symfony, Zend Expressive), Python (Flask), NodeJS, Ruby (Sinatra, Rails5), Rust (rust-server), Scala (Finch, Lagom, Scalatra) |
Генераторы документации | HTML, Confluence Wiki |
Файлы конфигурации | Apache2 |
Другое | JMeter для нагрузочного тестирования |
Плюсы Swagger Codegen:
Чтобы добавить Swagger Codegen в проект, используйте зависимость:
<dependency> <groupId>io.swagger.codegen.v3</groupId> <artifactId>swagger-codegen-maven-plugin</artifactId> <version>3.0.24</version> </dependency>
Как и в случае с Swagger Core, можно настроить maven-плагин для генерации клиента или мок-сервера.
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>3.3.4</version> <executions> <execution> <phase>compile</phase> <goals> <goal>generate</goal> </goals> <configuration> <generatorName>spring</generatorName> <inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec> <output>${project.build.directory}/generated-sources</output> <apiPackage>com.api</apiPackage> <modelPackage>com.model</modelPackage> <supportingFilesToGenerate> ApiUtil.java </supportingFilesToGenerate> <configOptions> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <artifactVersion>${project.version}</artifactVersion> <delegatePattern>true</delegatePattern> <sourceFolder>swagger</sourceFolder> <library>spring-mvc</library> <interfaceOnly>true</interfaceOnly> <useBeanValidation>true</useBeanValidation> <dateLibrary>java8</dateLibrary> <java8>true</java8> </configOptions> <ignoreFileOverride>${project.basedir}/.openapi-generator-ignore</ignoreFileOverride> </configuration> </execution> </executions> </plugin>
Swagger Codegen предоставляет следующие команды:
Config-help
— помощь с настройкой выбранного языка.Generate
— генерирование кода с выбранным генератором.Help
— вывод справочной информации про openapi-generator
.List
— список доступных генераторов.Meta
— генератор набора шаблонов и настроек Codegen. Использует информацию о выбранном языке.Validate
— проверка спецификации.Version
— отображение используемой версии.Самые полезные команды — generate
и validate
. Первая позволяет создать клиент, а вторая — проверить его соответствие спецификации. Посмотреть полный список возможностей можно с помощью команды help
после запуска jar-файла.
Swagger UI визуализирует ресурсы OpenAPI и взаимодействие с ними без отображения логики реализации. Этот инструмент берет спецификацию и превращает ее в интерактивный проект, где можно выполнять разные запросы для тестирования API.
Плюсы Swagger UI:
Пользовательский интерфейс Swagger полностью размещен в SwaggerHub
. Вы можете написать и визуализировать API или импортировать существующие определения для создания интерактивного интерфейса, размещенного в облаке. Благодаря встроенной интерактивности SwaggerHub
позволяет безопасно предоставлять доступ к документации внешним пользователям или другим разработчикам.
Это онлайн-редактор для изменения и проверки API внутри браузера. Позволяет просматривать документацию в реалтайме. С его помощью можно создать описания, а затем использовать их с полным набором инструментов для генерации документации.
Плюсы Swagger Editor:
Верхний уровень спецификации OpenAPI 3.0 содержит восемь объектов. Внутри этих верхнеуровневых объектов есть много вложенных объектов. Давайте далее последовательно рассмотрим все объекты верхнего уровня.
Первое и самое важное свойство в документации. Объект содержит информацию о спецификации OpenAPI. Пример:
openapi: "3.0.2"
В объекте info
содержится основная информация об API: заголовок, описание, версия, ссылки на лицензию, обслуживание, контактные данные. Не все свойства обязательны к заполнению.
Пример:
info: title: "My API" description: "Get anything" version: "1.1" termsOfService: "https://terms" contact: name: "API" url: "https://api" email: "test@test.com" license: name: "CC" url: "https://price"
Объект содержит базовый путь, который используется в запросах через API. Под базовым путём понимается часть адреса, которая находится перед конечной точкой. Servers
можно гибко настраивать, например, указывая несколько адресов для тестирования:
servers: - url: https://api/ description: Production - url: http://beta/ Description: Other
Спецификация OpenAPI
определяет path
как объект для указания конечной точки. Каждый path
содержит вложенный объект operations — методы GET, POST, PUT, DELETE
. Например:
paths: /weather: get:
В этом объекте хранятся различные схемы спецификации. Схемы позволяют заметно ускорить процесс составления описаний. Например:
components: schemas: User: Properties: name: type: string
Теперь можно ссылаться на эту схему и при необходимости без проблем дополнять её новыми полями.
Объект для объявления того, какие механизмы безопасности можно использовать в API.
Например, требование безопасности OAuth2
:
{ "petstore_auth": [ "write:pets", "read:pets" ] }
Объект добавляет метаданные к тегу, который используется объектом operations
. Например:
{ "name": "pet", "description": "Pets operations" }
В этом объекте можно указать дополнительную информацию. Например:
{ "description": "More info", "url": "https://here.com" }
Онлайн-редактор Swagger позволяет удобно работать над документацией со спецификацией. Он предлагает разделенный интерфейс. Слева вы пишете спецификацию, а справа видите отображение Swagger UI. В него даже можно отправлять запросы, чтобы сразу проверить правильность кода.
Petstore
для знакомстваPetstore
— это простой пример, который помогает понять логику работу с интерфейсом Swagger. Сам сайт сгенерирован с помощью Swagger UI. Он предоставляет три конечные точки: user, store
и pet
. Вы можете выбрать протокол — HTTPS или HTTP.
Прежде всего нужно авторизоваться. Для этого нажмите на кнопку Authorize
и заполните необходимую информацию.
В примере используется модель авторизации OAuth 2.0. На самом деле, код представлен в демонстрационных целях, никакой реальной логики за авторизацией нет. Так что можно просто закрыть окно.
Создадим первый запрос к API. Для этого:
POST/pet
.Try it out
. После этого тело запроса станет редактируемым.Example Value
и измените id
на случайное число.name
на любое имя.Execute
для выполнения запроса.Система отправит запрос и покажет curl
. Вы можете выбрать, в каком формате отобразить ответ — XML или JSON.
Напоследок выполним ещё один запрос, чтобы убедиться, что питомец создан.
GET/pet/{petId}
.Try it out
, чтобы сделать тело запроса редактируемым.id
питомца, который вы указали ранее в запросе POST
.Execute
, чтобы выполнить запрос.В ответе должно отобразиться имя созданного ранее питомца.
Это пример очень простой документации, которая позволяет быстро проверить работу доступных методов. Вы можете создать такой сайт самостоятельно или встроить интерфейс Swagger на страницу существующего ресурса — например, в справку о работе своего сервиса.
Вот ещё несколько примеров реализации Swagger:
Обращает на себя внимание краткость документации, реализованной с помощью Swagger. Это объясняется тем, что сам по себе Swagger UI предназначен для интерактивного взаимодействия. Нет смысла читать пространные описания, когда можно просто выполнять указанные запросы и проверять, какие ответы приходят.
При использовании Swagger UI необязательно использовать автономный сайт по типу Petstore
. Можно встраивать Swagger в существующую страницу. Вот пример такой страницы:
Здесь встроен экземпляр Swagger UI, который показывает файл OpenAPI для OpenWeatherMapAPI
. Выглядит как неплохо сверстанная документация, хотя в оформлении остались дефолтные элементы. При большом желании их тоже можно поменять. Гораздо важнее, что можно автоматизировать процесс обновления такой внешней документации.
Чтобы встроить Swagger UI на свой сайт:
dist
. Остальные каталоги и файлы не понадобятся.dist
. index.html
в папке dist
.Petstore
укажите относительную ссылку на ваш файл с документацией.index.html
.Отображение документации можно проверить локально. Если всё в порядке, загрузите папку dist
(ее можно переименовать) на сервер и добавьте документацию на существующий сайт.
Подробную инструкцию можно найти на этой странице на GitHub.
Swagger — удобный инструмент для создания документации API, который помогает разработчикам сэкономить время. Он предлагает несколько решений для интеграции в проект и формирования интерактивной версии документации, с которой будет удобно взаимодействовать другим разработчикам, внешним пользователям, клиентам.
Чтобы разобраться со Swagger дополнительно, посмотрите эти видео или запишитесь на онлайн курсы от Mate Academy.
Например, вот доклад технического писателя из «Яндекса» о том, что такое вообще API и как работать со Swagger. Много времени также уделено практической части — в ней делается простой Swagger, который затем отображается в Swagger UI
и в документации.
Ещё одно классное видео — подробное объяснение, как использовать Swagger:
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…