Swagger/OpenAPI генерация для Go (Golang): go-swagger и oapi-codegen

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Swagger/OpenAPI генерация для Go (Golang): go-swagger и oapi-codegen

Разработка современных веб-сервисов на Go требует строгой спецификации API. OpenAPI (ранее известный как Swagger) — это стандарт описания RESTful интерфейсов, который позволяет автоматизировать создание клиентов, серверов и документации. В экосистеме Go существует два ключевых инструмента для генерации кода из OpenAPI-спецификаций: go-swagger и oapi-codegen. В этой статье мы подробно разберём оба подхода, их установку и практическое применение.

Что такое OpenAPI и зачем генерировать код?

OpenAPI Specification (OAS) — это формат файла (обычно YAML или JSON), который описывает эндпоинты, параметры, типы данных и схемы ответов вашего API. Вместо того чтобы вручную писать обработчики, модели и валидацию, вы можете:

  • Сгенерировать серверный код с маршрутами и middleware.
  • Сгенерировать клиентский SDK для других сервисов.
  • Автоматически обновлять документацию (Swagger UI).
  • Избежать рассинхронизации между спецификацией и реализацией.

Инструмент №1: go-swagger

go-swagger — это мощный, но более тяжёлый инструмент, который поддерживает не только генерацию, но и валидацию спецификаций. Он идеально подходит для сложных проектов с версионированием.

Установка go-swagger

# Установка через go install (Go 1.17+)
go install github.com/go-swagger/go-swagger/cmd/swagger@latest

# Проверка установки
swagger version

Генерация сервера из спецификации

Предположим, у нас есть файл api.yaml:

openapi: "3.0.0"
info:
  title: Pet Store
  version: "1.0.0"
paths:
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      responses:
        '200':
          description: A list of pets
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Pet'
components:
  schemas:
    Pet:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string

Выполните генерацию сервера:

swagger generate server -f api.yaml -A petstore -t ./gen

После выполнения в папке ./gen появятся:

  • restapi/ — обработчики и маршруты.
  • models/ — структуры данных (Pet, Error и т.д.).
  • cmd/ — точка входа в приложение.

Пример реализации обработчика

package restapi

import (
    "net/http"
    "petstore/gen/models"
    "petstore/gen/restapi/operations"
)

func configureAPI(api *operations.PetstoreAPI) http.Handler {
    api.ListPetsHandler = operations.ListPetsHandlerFunc(
        func(params operations.ListPetsParams) middleware.Responder {
            pets := []*models.Pet{
                {ID: 1, Name: "Buddy"},
                {ID: 2, Name: "Milo"},
            }
            return operations.NewListPetsOK().WithPayload(pets)
        },
    )
    return api.Serve(nil)
}

Инструмент №2: oapi-codegen

oapi-codegen — это современный, лёгкий и очень быстрый генератор от команды DeepMap. Он поддерживает OpenAPI 3.0 и фокусируется на минимализме. Рекомендуется для новых проектов.

Установка oapi-codegen

go install github.com/deepmap/oapi-codegen/v2/cmd/oapi-codegen@latest

Генерация типов и сервера

Используем ту же спецификацию api.yaml. Выполните:

oapi-codegen -generate types,server -package petstore api.yaml > petstore.gen.go

Флаг -generate позволяет выбрать, что генерировать:

  • types — Go-структуры для схем.
  • server — интерфейсы сервера.
  • client — HTTP-клиент.
  • spec — встраивание спецификации.

Пример реализации с oapi-codegen

package main

import (
    "net/http"
    "petstore"
)

type Server struct{}

func (s *Server) ListPets(w http.ResponseWriter, r *http.Request, params petstore.ListPetsParams) {
    pets := []petstore.Pet{
        {Id: 1, Name:                    

Рекомендаций