Published on

「Spring Boot API 開發:從 0 到 1」Day 15 API 文件自動化

我們將介紹如何在 Spring Boot 項目中整合 Swagger 來自動生成 API 文件

這將有助於提高開發效率並改善 API 的可用性

Swagger 簡介

Swagger 是一個開源的 API 文件框架。它可以自動生成 API 文件,提供一個 UI 界面來展示和測試 API,並幫助前後端開發人員更好地溝通

Swagger 的主要功能包括

  • 自動生成 API 文件
  • 提供 UI 展示 API
  • 允許直接在界面上測試 API
  • 簡化 API 的使用和理解

在 Spring Boot 中整合 Swagger

添加套件依賴

相關的套件位置

// https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui
implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.6.0'

注意:這裡使用的是 springdoc-openapi 的套件

  • Swagger 3 使用 springdoc-openapi 套件,而 Swagger 2 使用 springfox 套件
  • Swagger 3 遵循 OpenAPI 3.0 規範,而 Swagger 2 遵循舊版的 Swagger 2.0 規範

配置 Swagger

建立一個配置類別來自訂 Swagger 的行為

注意 import 的 package 不要選錯了

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.servers.Server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
<!-- 這裡只列出了和 swagger 相關的 import -->

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Todo List API")
                        .version("1.0")
                        .description("一個簡單但功能強大的待辦事項 API")
                        .contact(new Contact()
                                .name("Cash")
                                .email("[email protected]")))
                .servers(List.of(
                        new Server().url("http://localhost:8080").description("開發環境"),
                        new Server().url("https://api.example.com").description("生產環境")
                ));
    }
}

添加 Swagger 註解

在控制器類中添加 Swagger 註解:

@RestController
@RequestMapping("/api/todos")
@Tag(name = "Todo", description = "待辦事項管理 API")
public class TodoController {

    @PostMapping
    @Operation(summary = "建立新的待辦事項", description = "建立一個新的待辦事項並將其加入清單中",
    responses = {
            @ApiResponse(responseCode = "200", description = "成功創建待辦事項",
                    content = @Content(schema = @Schema(implementation = ApiResponse.class))),
            @ApiResponse(responseCode = "400", description = "無效的輸入")
    })
    public ResponseEntity<MyApiResponse<Todo>> createTodo(
        @Parameter(description = "待辦事項")
        @RequestBody Todo todo) {
        // 實現邏輯
    }

    @GetMapping
    @Operation(summary = "取得所有待辦事項", description = "取得所有待辦事項的清單")
    public ResponseEntity<MyApiResponse<List<Todo>>> getAllTodos() {
        // 實現邏輯
    }

    // 其他方法類似,可以參考 Github 上 repository 的 commit ...
}

注意:因為前面範例中自定義的 ApiResponse,會跟 swagger 裡面定義的 ApiResponse 名稱有衝突,所以在這個範例裡面把自定義的 ApiResponse 改名為 MyApiResponse

常用的 Swagger 註解

  • @Tag : 用於為 API 控制器分類
  • @Operation : 描述 API 端點的操作
  • @ApiResponse : 描述 API 操作的回應
  • @Parameter : 描述 API 操作的參數
  • @Schema : 定義模型 (model) 相關參數
  • @Hidden : 在 Swagger 文件中隱藏特定的 API 操作或字段

查看生成的文件

啟動 Spring Boot 應用後,在瀏覽器中訪問

就可以看到 Swagger UI,其中包含我們設定的相關參數和所有的 API 端點資訊

下面是在 Swagger UI 中測試 API 的情況

額外的 Swagger 配置

可以在 application.properties 中添加以下常用的配置

# 這個參數用來設定 Swagger UI 的訪問路徑。預設情況下,Swagger UI 的路徑是 /swagger-ui/index.html
springdoc.swagger-ui.path=/my-custom-swagger-ui

# 這個參數用來設定生成的 OpenAPI 文檔的訪問路徑。預設情況下,這個路徑是 /v3/api-docs
springdoc.api-docs.path=/my-api-docs

# 這個參數用來指定 SpringDoc 應該掃描哪些包來生成 API 文檔。如果不指定,SpringDoc 會掃描所有的包
springdoc.packages-to-scan=com.demo.todolist.controller

# 這個參數用來指定哪些路徑應該包含在生成的 OpenAPI 文檔中。這在你只想要生成特定路徑的 API 文檔時非常有用。
springdoc.paths-to-match=/api/todos/**

# 這個參數用來設定是否在 Swagger UI 中顯示每個 API 請求的持續時間
springdoc.swagger-ui.display-request-duration=true

經測試後發現,即使配置了自訂路徑,瀏覽時仍會導向到 /swagger-ui/index.html,原因尚待確認

結論

整合 Swagger 後,API 文件會自動產生和更新,開發者可以直接在 UI 上面查看和測試 API

這提高了開發效率,改善了團隊協作,並增強了 API 的可用性。自動產生的文件確保了文件與實際 API 實現的一致性,減少了手動維護文件的工作量。

同步刊登於 iTHome 鐵人賽 「Spring Boot API 開發:從 0 到 1」Day 15 API 文件自動化

圖片來源:AI 產生

參考連結