Syntax highlighting of d6df66f ~( doc/swagger)

= Swagger =

<<TableOfContents()>>

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

Ключевые особенности Swagger/OpenAPI включают:

  * '''Документация API''': Он позволяет разработчикам определить конечные точки API, типы данных запросов и ответов, заголовки, методы аутентификации и многое другое с использованием машиночитаемого формата (обычно JSON или YAML).
  * '''Интерактивная документация''': Swagger генерирует интерактивную и понятную человеку документацию для API. Эта документация позволяет разработчикам исследовать и тестировать конечные точки API напрямую из веб-браузера, что упрощает понимание работы API.
  * '''Генерация кода''': На основе спецификации API Swagger может генерировать клиентские библиотеки, серверные заглушки и документацию API на различных языках программирования. Это ускоряет разработку и обеспечивает согласованность между спецификацией API и фактическим кодом.
  * '''Валидация''': Спецификацию можно использовать для проверки запросов и ответов, что помогает выявлять ошибки на ранних этапах разработки.
  * '''Тестирование''': Документация Swagger часто включает интерактивные функции, которые позволяют разработчикам отправлять запросы к конечным точкам API и просматривать ответы. Это помогает тестировать функциональность API.
  * '''Подход "Проектирование сначала"''': Swagger поощряет подход "проектирование сначала", при котором спецификация API создается перед написанием кода. Это помогает проектировать хорошо структурированные и согласованные API.
  * '''Совместная работа''': Стандартизированный формат Swagger/OAS обеспечивает лучшую совместную работу между командами разработчиков, а также с сторонними разработчиками, которые хотят интегрироваться с API.
  * '''Версионирование''': Версионирование API может быть обработано в спецификации Swagger, что четко указывает, к какой версии API относится каждая конечная точка.

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

== Полезные ссылки ==

 . [[https://www.openapis.org/]]
 . [[https://swagger.io/]]
 . [[https://hub.docker.com/u/swaggerapi|Образы swagger]]
 . [[https://swagger.io/specification/|OpenApi Specification v3.1.0]] | [[https://swagger.io/docs/specification/data-models/data-types/|Data Types]]
 . [[https://swagger.io/docs/specification/using-ref/|Using $ref]]
 . [[https://swagger.io/docs/specification/describing-request-body/file-upload/|File Upload]]
 . [[https://swagger.io/docs/specification/describing-responses/|Describing Responses]]
 . [[https://github.com/OAI/OpenAPI-Specification/tree/main/examples|Examples]]
 . [[https://swagger.io/docs/specification/data-models/representing-xml/|Representing XML]]

 . [[https://davidgarcia.dev/posts/how-to-split-open-api-spec-into-multiple-files/|How to split a large OpenAPI document into multiple files]]

 . [[https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types|Неполный список типов MIME]]

Аналоги swagger:

 . [[http://dapperdox.io/|dapperdox]]
 . [[https://dev.to/artis3n/what-api-documentation-generator-tool-do-you-use-2bi|What API documentation generator/tool do you use?]]
 . [[https://redoc.ly/]]
 . [[https://stoplight.io/studio/]]

Прочее:

 . [[https://stoplight.io/open-source/prism|An open-source HTTP mock and proxy server]]

== Алиасы ==

{{{#!highlight bash
alias swal='swagger-cli validate swagger.yml'
alias swaal='swagger-cli validate swagger.yaml'
alias swau='docker run --rm -it -p 80:8080 -v $(pwd):/swagger -e SWAGGER_JSON=/swagger/swagger.yml swaggerapi/swagger-ui'
alias swaau='docker run --rm -it -p 80:8080 -v $(pwd):/swagger -e SWAGGER_JSON=/swagger/swagger.yaml swaggerapi/swagger-ui'
}}}

== Редактирование ==

=== swagger-editor ===

{{{#!highlight bash
docker run --rm -it \
    -p 8080:8080 \
    swaggerapi/swagger-editor
}}}

=== swagger-ui ===

[[https://swagger.io/docs/open-source-tools/swagger-ui/usage/installation/|Установка]]

Запуск сервера UI с отображением API через *url*

{{{#!highlight bash
docker run --rm -it \
    -p 80:8080 \
    -e API_URL=http://generator.swagger.io/api/swagger.json \
    swaggerapi/swagger-ui
}}}

Переходим по [[http://localhost]] и наблюдаем отображение *swagger.json*

Для отображение произвольного json можно воспользоваться параметром *url* :

[[http://localhost/?url=https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v3.0/petstore-expanded.yaml#/default/findPets]]

Запуск сервера UI с отображением API через файл

{{{#!highlight bash
docker run --rm -it \
    -p 80:8080 \
    -v /path/to/my/specs:/opt/specs \
    -e SWAGGER_JSON=/opt/specs/swagger.json \
    swaggerapi/swagger-ui
}}}

Несколько JSON-файлов в UI

Данное решение предполагает замену директории */usr/share/nginx/html* в запускаемом контейнере *swagger-ui*

{{{#!highlight bash
# --- клонируем репозиторий swagger-ui
git clone --depth=1 git@github.com:swagger-api/swagger-ui.git
# --- создаем монтируюмую директорию и копируем туда всё из dist
mkdir myhtml
cp -r swagger-ui/dist/* myhtml
# --- копируем туда же свои swagger.json-ы
cp /path/to/my/swagger/files/* myhtml/
# --- запускаем контейнер swagger-ui
docker run --rm -it \
    -p 80:8080 \
    -v /path/to/myhtml:/usr/share/nginx/html \
    -e SWAGGER_JSON=base-name-of-default-file.json \
    swaggerapi/swagger-ui
}}}

Переходим на [[http://localhost]] и наблюдаем наш файл. Для отображения другого json-файла задаем адрес [[http://localhost?url=another-swagger-file.json]]

=== VSCode ===

Устанавливаем vscode

{{{#!highlight bash
sudo snap install --classic code
}}}

Устанавливаем расширения:
 . [[https://marketplace.visualstudio.com/items?itemName=42Crunch.vscode-openapi|OpenAPI (Swagger) Editor]]
 . [[https://marketplace.visualstudio.com/items?itemName=zoellner.openapi-preview|OpenAPI Viewer]]
 . [[https://marketplace.visualstudio.com/items?itemName=vscodevim.vim|Vim Mode]]
 . [[https://marketplace.visualstudio.com/items?itemName=Atif.vs-redoc-viewer|ReDoc Viewer]]


== Валидация ==

[[https://github.com/APIDevTools/swagger-cli|swagger-cli]]

{{{#!highlight bash
sudo npm install -g @apidevtools/swagger-cli
swagger-cli validate path/to/swagger.yml
}}}

[[https://github.com/Redocly/openapi-cli|openapi-cli]]

{{{#!highlight bash
npx @redocly/openapi-cli lint path/to/swagger.yml --format stylish --skip-rule info-license
}}}

[[https://github.com/apigee-127/swagger-tools|swagger-tools]]

{{{#!highlight bash
sudo npm install -g swagger-tools
swagger-tools validate swagger/app.json
....
92 errors and 0 warnings
echo $?
1
swagger-tools validate ~/tmp/swagger.json
echo $?
0
}}}