前言
當開發RESTful API時,有效的文檔是極其重要的,它可以幫助開發者快速理解和使用API。Swagger是一個強大的工具,用於自動生成和維護API文檔。
本文將指導你如何使用Swagger在Gin框架中自動生成API文檔,並提供一些維護的最佳實踐。
為什麼選擇Swagger?
1.標準化: Swagger遵循OpenAPI規範,這是一個業界標準。
2.交互性: Swagger UI允許用戶直接從文檔中測試API,無需其他工具。
安裝流程
安裝必要的套件
首先,我們需要安裝swag CLI工具和Gin的Swagger中間件。
swagger cmd: 用於生成介面文件的命令列工具。
1 | go get -u github.com/swaggo/swag/cmd/swag |
Starting in Go 1.17, installing executables with go get is deprecated. go install may be used instead:
1 | go install github.com/swaggo/swag/cmd/swag@latest |
gin-swagger: gin與swagger的中介軟體。
files: 幫助建立檔案
1 | go get -u github.com/swaggo/gin-swagger |
在你的主要應用文件中執行以下命令:
1 | swag init |
:::warning
這邊實作遇到這個問題,後來看這篇文章
[Golang] “swag: command not found”error handling
輸入以下指令以獲得 Go 的工作路徑
go env GOPATH
找路徑後到 go/bin資料夾中,輸入下方command
1 | PATH=$(go env GOPATH)/bin:$PATH |
回到專案資料夾,即可正常使用
:::
這將生成docs目錄,其中包含Swagger的文檔資料。
將Swagger UI加入Gin
在你的Gin應用中,導入必要的包並將Swagger中間件添加到路由。
1 | import ( |
這一步實作發現還要引入專案 docs 文件才行
Swagger 註解
一般說明
1 | // @title Gin swagger |
API Info
註解 | 描述 |
---|---|
title | 必須簡單API專案的標題或主要的業務功能 |
version | 必須目前這專案/API的版本 |
description | 簡單描述 |
tersOfService | 服務條款 |
contact.name | 作者名稱 |
contact.url | 作者blog |
contact.email | 作者email |
license.name | 必須許可證名稱 |
license.url | 許可證網址 |
host | 服務名稱或者是ip |
BasePath | 基本URL路徑, (/api/v1, /v2…) |
schemes | 提供的協定, (http, https) |
API 功能註解
API Operation
1 | helloHandler.go |
註解 | 描述 |
---|---|
summary | 描述該API |
tags | 歸屬同一類的API的tag |
accept | request的context-type |
produce | response的context-type |
param | 參數按照 參數名 參數類型 參數的資料類型 是否必須 註解 (中間都要空一格) |
header | response header return code 參數類型 資料類型 註解 |
router | path httpMethod |
最佳作法
1.保持文檔最新: 每次更新API時,確保運行swag init以更新文檔。
2.描述和詳細: 使用Swagger註釋提供充分的API描述和範例。
3.版本控制: 如果你的API有多個版本,確保在Swagger文檔中明確指出。
結論
利用Swagger與Gin結合,不僅可以自動生成API文檔,還可以提供一個交互式的界面,使其他開發者更容易理解和使用你的API。
但這邊目前看來還是要人工撰寫,感覺不夠自動化,我認為需要再進一找看看有沒有自動化工具
swagger 註解自動化
參考資料:
https://peggy-tsai.medium.com/golang-swag-command-not-found-error-handling-52e2cbc5240e
https://vocus.cc/article/650d7ee8fd89780001aa431a
https://github.com/swaggo/swag/issues/197?source=post_page-----52e2cbc5240e--------------------------------#issuecomment-585102353