Gymterview
middle

Как документировать REST API с помощью Swagger/OpenAPI?

OpenAPI Specification (ранее Swagger Specification) — стандарт описания REST API в формате JSON или YAML. Swagger — набор инструментов для работы с OpenAPI (Swagger UI, Swagger Editor, Swagger Codegen).

Основные инструменты

  • Swagger UI — интерактивная веб-документация с возможностью отправки запросов.
  • OpenAPI Generator / Swagger Codegen — генерация клиентов и серверов из спецификации.
  • Springdoc-openapi — библиотека для автоматической генерации OpenAPI-документации в Spring Boot.

Настройка в Spring Boot (springdoc-openapi)

Пример
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.5.0</version>
</dependency>

После подключения доступны:

  • http://localhost:8080/swagger-ui.html — Swagger UI.
  • http://localhost:8080/v3/api-docs — OpenAPI-спецификация в JSON.
Аннотации для документирования
@RestController
@RequestMapping("/api/users")
@Tag(name = "Users", description = "Управление пользователями")
public class UserController {

    @Operation(
        summary = "Получить пользователя по ID",
        description = "Возвращает полную информацию о пользователе"
    )
    @ApiResponses({
        @ApiResponse(responseCode = "200", description = "Пользователь найден",
            content = @Content(schema = @Schema(implementation = UserDto.class))),
        @ApiResponse(responseCode = "404", description = "Пользователь не найден",
            content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
    })
    @GetMapping("/{id}")
    public ResponseEntity<UserDto> getUser(
            @Parameter(description = "ID пользователя", example = "42")
            @PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }

    @Operation(summary = "Создать нового пользователя")
    @ApiResponse(responseCode = "201", description = "Пользователь создан")
    @PostMapping
    public ResponseEntity<UserDto> createUser(
            @RequestBody @Valid CreateUserRequest request) {
        UserDto created = userService.create(request);
        URI location = URI.create("/api/users/" + created.id());
        return ResponseEntity.created(location).body(created);
    }
}

Документирование модели:

@Schema(description = "Запрос на создание пользователя")
public record CreateUserRequest(
    @Schema(description = "Имя пользователя", example = "Иван Петров")
    @NotBlank String name,

    @Schema(description = "Email", example = "ivan@example.com")
    @Email String email,

    @Schema(description = "Возраст", minimum = "18", maximum = "120")
    @Min(18) Integer age
) {}

Глобальная конфигурация:

@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
            .info(new Info()
                .title("User Service API")
                .version("1.0.0")
                .description("API для управления пользователями"))
            .addSecurityItem(new SecurityRequirement().addList("Bearer"))
            .components(new Components()
                .addSecuritySchemes("Bearer",
                    new SecurityScheme()
                        .type(SecurityScheme.Type.HTTP)
                        .scheme("bearer")
                        .bearerFormat("JWT")));
    }
}

На собеседовании: нужно знать разницу между OpenAPI (спецификация) и Swagger (инструменты), уметь назвать ключевые аннотации (@Operation, @Tag, @Schema). Частая ошибка — путать Swagger и OpenAPI или не знать про springdoc-openapi для Spring Boot 3.