Swagger: что это такое и как с ним работать?

Сергей Почекутов

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

Ручное формирование документации — утомительное занятие. Поэтому разработчики придумали Swagger. С его помощью на основе кода можно автоматически сгенерировать спецификации API.

Содержание статьи:

Что такое Swagger
Основные подходы
Swagger Core
Swagger Codegen
Swagger UI
Swagger Editor
Использование Petstore для знакомства
Авторизация
Создание запроса
Проверка результата
Как выглядят сайты с документацией Swagger UI
Как встроить Swagger UI в существующий сайт
Заключение

Что такое Swagger?

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. Конечно, второй подход позволяет сделать документацию более качественной и кастомной для каждого конкретного проекта и его особенностей, к тому же все не так сложно как может показаться, это потребует минимальных дополнительных усилий.

Swagger Core

Это Java-реализация спецификации. Для ее использования потребуется:

  • Java 8 и выше
  • Apache Maven 3.0.4 и выше
  • Jackson 2.4.5 и выше

Для его внедрения в проект используются две зависимости. Вот примеры:

<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 Для скрытия ресурса, операции или свойства

Swagger Codegen

Это проект для автоматического генерирования клиентских библиотек 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:

  • Генерирование серверов — позволяет избавиться от рутины, создавая шаблонный код на 20+ языках.
  • Упрощенное генерирование SDK — можно создавать клиентские наборы на 40+ языках для быстрой интеграции с вашим API.
  • Постоянное обновление инструментов.

Чтобы добавить 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

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

Плюсы Swagger UI:

  • Нет зависимостей. Интерфейс доступен в любой среде разработки.
  • Полная поддержка браузерами.
  • Удобное взаимодействие для других разработчиков и клиентов. Можно проверить все операции, предоставляемые API, даже не имея специальных знаний.
  • Простая навигация. Ресурсы и конечные точки представлены в виде аккуратно распределенного на категории списка.
  • Можно настраивать стиль и пользовательский интерфейс так, как вам хочется.

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

Swagger Editor

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

Плюсы Swagger Editor:

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

Верхний уровень спецификации OpenAPI 3.0 содержит восемь объектов. Внутри этих верхнеуровневых объектов есть много вложенных объектов. Давайте далее последовательно рассмотрим все объекты верхнего уровня.

  1. Openapi

Первое и самое важное свойство в документации. Объект содержит информацию о спецификации OpenAPI. Пример:

openapi: "3.0.2"

  1. Info

В объекте 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"
  1. Servers

Объект содержит базовый путь, который используется в запросах через API. Под базовым путём понимается часть адреса, которая находится перед конечной точкой. Servers можно гибко настраивать, например, указывая несколько адресов для тестирования:

servers:
  - url: https://api/
        description: Production
  - url: http://beta/
        Description: Other
  1. Paths

Спецификация OpenAPI определяет path как объект для указания конечной точки. Каждый path содержит вложенный объект operations — методы GET, POST, PUT, DELETE. Например:

paths:
  /weather:
     get:
  1. Components

В этом объекте хранятся различные схемы спецификации. Схемы позволяют заметно ускорить процесс составления описаний. Например:

components:
  schemas:
    User:
      Properties:
        name:
          type: string 

Теперь можно ссылаться на эту схему и при необходимости без проблем дополнять её новыми полями.

  1. Security

Объект для объявления того, какие механизмы безопасности можно использовать в API. 

Например, требование безопасности OAuth2:

{
  "petstore_auth": [
    "write:pets",
    "read:pets"
  ]
}
  1. Tags

Объект добавляет метаданные к тегу, который используется объектом operations. Например:

{
    "name": "pet",
    "description": "Pets operations"
}
  1. externalDocs

В этом объекте можно указать дополнительную информацию. Например:

{
  "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. Для этого:

  1. Разверните конечную точку POST/pet.
  2. Нажмите на кнопку Try it out. После этого тело запроса станет редактируемым.
  3. Найдите поле Example Value и измените id на случайное число.
  4. Измените name на любое имя.
  5. Нажмите Execute для выполнения запроса.

Система отправит запрос и покажет curl. Вы можете выбрать, в каком формате отобразить ответ — XML или JSON.

Проверка результата

Напоследок выполним ещё один запрос, чтобы убедиться, что питомец создан.

  1. Разверните конечную точку GET/pet/{petId}.
  2. Нажмите на кнопку Try it out, чтобы сделать тело запроса редактируемым.
  3. Введите id питомца, который вы указали ранее в запросе POST.
  4. Нажмите Execute, чтобы выполнить запрос.

В ответе должно отобразиться имя созданного ранее питомца. 

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

Как выглядят сайты с документацией Swagger UI

Вот ещё несколько примеров реализации Swagger:

Обращает на себя внимание краткость документации, реализованной с помощью Swagger. Это объясняется тем, что сам по себе Swagger UI предназначен для интерактивного взаимодействия. Нет смысла читать пространные описания, когда можно просто выполнять указанные запросы и проверять, какие ответы приходят.

Как встроить Swagger UI в существующий сайт

При использовании Swagger UI необязательно использовать автономный сайт по типу Petstore. Можно встраивать Swagger в существующую страницу. Вот пример такой страницы:

Здесь встроен экземпляр Swagger UI, который показывает файл OpenAPI для OpenWeatherMapAPI. Выглядит как неплохо сверстанная документация, хотя в оформлении остались дефолтные элементы. При большом желании их тоже можно поменять. Гораздо важнее, что можно автоматизировать процесс обновления такой внешней документации.  

Чтобы встроить Swagger UI на свой сайт:

  1. Подготовьте документ спецификации OpenAPI.
  2. Клонируйте себе или скачайте в виде архива с GitHub содержимое репозитория Swagger UI.
  3. Извлеките папку dist. Остальные каталоги и файлы не понадобятся.
  4. Перетащите созданные ранее файл OpenAPI в папку dist.
  5. Откройте файл index.html в папке dist.
  6. Найдите строку с URL. Там будет ссылка на Petstore: ‘http://petstore.swagger.io/v2/swagger.json’.
  7. Замените URL. Вместо Petstore укажите относительную ссылку на ваш файл с документацией.
  8. Сохраните изменения в файле index.html.

Отображение документации можно проверить локально. Если всё в порядке, загрузите папку dist (ее можно переименовать) на сервер и добавьте документацию на существующий сайт.

Подробную инструкцию можно найти на этой странице на GitHub.

Заключение

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

Чтобы разобраться со Swagger дополнительно, посмотрите эти видео или запишитесь на онлайн курсы от Mate Academy

Например, вот доклад технического писателя из «Яндекса» о том, что такое вообще API и как работать со Swagger. Много времени также уделено практической части — в ней делается простой Swagger, который затем отображается в Swagger UI и в документации.

Ещё одно классное видео — подробное объяснение, как использовать Swagger:

 

 

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023