自動生成接口文檔的好處
説之前,先説一下自動生成接口文檔有哪些好處?
1)節省時間和工作量:手動編寫接口文檔是一項耗時且繁瑣的任務。通過自動生成接口文檔,可以大大減少編寫文檔的時間和工作量,提高開發效率。
2)保持文檔與代碼同步:代碼和文檔往往是不同步的,當代碼發生變更時,手動更新文檔可能容易出現遺漏或錯誤。自動生成接口文檔可以保持文檔與代碼的同步,確保文檔的準確性和實時性。
3)提供一致的文檔格式:通過自動生成接口文檔,可以定義一致的文檔格式和結構,使得所有接口文檔都具有相同的風格和組織方式。這樣可以提高文檔的可讀性和易用性,減少理解和使用文檔的成本。
4)方便團隊協作和交流:自動生成的接口文檔可以作為團隊協作和交流的重要工具。團隊成員可以很方便地查閲接口文檔,瞭解接口的定義、參數、返回值等信息,從而更好地進行開發、測試和集成工作。
5)提升接口的可測試性:自動生成的接口文檔通常會包含接口的請求示例和響應示例,這些示例可以用於接口的測試和驗證。這樣可以提升接口的可測試性,減少開發人員在編寫測試代碼時的工作量。
總結:自動生成接口文檔可以大大提高開發效率、保持文檔與代碼同步、提供一致的文檔格式、方便團隊協作和交流,並提升接口的可測試性。這對於項目的開發和維護都是非常有益的。
項目使用的工具包
接下來,説一下咱們項目使用的工具包:Swag。
目前在項目中已經集成完畢,大家只要寫好註釋,執行腳本,就可以自動生成接口文檔。接口文檔地址:http://127.0.0.1:9999/swagger/index.html
為了安全起見,接口文檔地址在啓動參數 -env=pro 時,不可預覽!
在 Go 語言中,Swagger 是一種用於描述和定義 RESTful API 的規範。Go Swag 是一個用於自動生成 Swagger 文檔的工具。為了使用 Go Swag 生成 Swagger 文檔,你需要在代碼中添加相應的註釋。
以下是一些常見的 Go Swag 註釋示例:
// @Summary 創建管理員
// @Description 創建管理員
// @Tags API.admin
// @Accept application/x-www-form-urlencoded
// @Produce json
// @Param username formData string true "用户名"
// @Param mobile formData string true "手機號"
// @Success 200 {object} createResponse
// @Failure 400 {object} code.Failure
// @Router /api/admin [post]
其中:
- @Summary 表示 API 接口的簡要説明。
- @Description 表示 API 接口的詳細描述。
- @Tags 表示 API 接口所屬的標籤。
- @Accept 表示 API 接口所支持的請求格式。
- @Produce 表示 API 接口所支持的響應格式。
- @Param 表示 API 接口的參數,包括參數名、類型、是否必填等信息。
- @Success 表示 API 接口的成功響應結果,包括狀態碼和返回數據類型。
- @Failure 表示 API 接口的失敗響應結果,包括狀態碼和錯誤信息類型。
- @Router 表示 API 接口的路由地址。
@Tags
用於對 API 接口進行標記和分類。它可以幫助組織和管理 API 接口,並在生成的 Swagger 文檔中展示接口的標籤信息。
@Tags 註釋參數用於指定 API 接口所屬的標籤或分類。該參數可以設置一個或多個值,每個值表示一個標籤,使用半角逗號,分隔。標籤可以根據業務功能、模塊或者其他自定義規則進行分類。例如,你可以使用以下標籤:Users、Orders、Products 等。
通過在 API 接口註釋中使用 @Tags 參數,可以將接口按照功能或模塊進行分類。這些標籤將在生成的 Swagger 文檔中呈現出來,方便用户瀏覽和查找相關的接口。同時,Swagger UI 也可以通過標籤進行接口的過濾和展示。
@Accept
用於指定 API 接口所支持的請求內容類型。它可以幫助生成準確的 Swagger 文檔,並向用户展示 API 接口接受的請求數據類型。
@Accept 註釋參數用於指定 API 接口接受的請求內容類型。該參數可以設置多個值,每個值表示一個請求內容類型,使用半角逗號,分隔。
常見的請求內容類型包括:
- application/json:JSON 格式數據
- application/xml:XML 格式數據
- application/octet-stream:二進制數據
- multipart/form-data:表單數據
- text/plain:純文本數據
- application/x-www-form-urlencoded:URL 編碼的數據
在實際使用中,你可以根據 API 接口的需求,設置不同的請求內容類型。這些註釋參數將會在生成的 Swagger 文檔中顯示出來,方便用户瞭解和使用 API 接口。
@Produce
用於指定 API 接口返回的響應內容類型。它可以幫助生成準確的 Swagger 文檔,並向用户展示 API 接口可能返回的不同數據格式。
@Produce 註釋參數用於指定 API 接口返回的響應內容類型。該參數可以設置多個值,每個值表示一個響應內容類型,使用半角逗號,分隔。
常見的響應內容類型包括:
- application/json:JSON 格式數據
- application/xml:XML 格式數據
- text/plain:純文本數據
- image/jpeg:JPEG 圖像數據
- application/pdf:PDF 文檔數據
在實際使用中,你可以根據 API 接口的需求,設置不同的響應內容類型。這些註釋參數將會在生成的 Swagger 文檔中顯示出來,方便用户瞭解和使用 API 接口。同時,Swagger UI 也會根據這些參數提供相應的選擇和展示。
@Param
用於標識 API 接口的參數。它包含多個字段,每個字段都表示參數的不同屬性。
以下是 @Param 註釋中常用的字段類型及其詳細解釋:
- name:參數名
-
in:參數位置
常見的參數位置包括 path、query、header、formData 和 body。
- path:路徑參數,出現在 URL 路徑中。例如,/users/{id} 中的 {id} 就是路徑參數。
- query:查詢參數,出現在 URL 的查詢字符串中。例如,/users?name=John 中的 name 就是查詢參數。
- header:請求頭參數,出現在 HTTP 請求的頭部信息中。
- formData:表單數據參數,出現在 POST 請求的表單數據中。
- body:請求體參數,出現在請求的消息體中,通常用於 POST 或 PUT 請求。
-
type:參數類型
常見的數據類型包括 int、string、bool、float、time.Time 等。你也可以使用自定義的結構體類型作為參數類型。
-
required:是否必填
true 表示必填,false 表示可選,默認為 false。
- description:參數描述
-
format:參數格式
例如,當參數類型為 string 時,可以指定其格式為 email、date-time 等。
-
enum:枚舉值
表示參數的取值範圍,用於限制參數的可選值。
- default:默認值
在實際使用中,你可以根據具體的 API 接口需求,設置不同的參數類型、位置和屬性。這些參數註釋將幫助生成準確的 Swagger 文檔,並提供給用户參考和使用。
@Router
用於指定 API 接口的路由信息,包括 HTTP 方法和路徑。
需要注意的是,在使用 @Router 參數時,需要將 HTTP 方法和路徑放在方括號內,中間使用空格分隔。同時,路徑中的路徑參數也需要使用大括號進行標記。
在 Swag 中,使用 @Router 參數來描述 API 接口的路由信息,可以讓 Swagger 自動生成 API 文檔,並且方便測試人員和開發人員快速瞭解和測試 API 接口。
@Security
用於指定 API 接口的安全需求和認證要求。通過使用 @Security 參數,可以指定 API 接口需要的安全方案,以及安全方案的作用範圍。
在實際使用中,@Security 參數通常與安全方案定義結合使用。安全方案可以包括 API 密鑰認證、基本認證、OAuth 等各種認證方式。
通過使用 @Security 參數,可以讓 Swagger 自動生成的 API 文檔中明確顯示出每個 API 接口所需要的安全認證信息,以及開發人員如何進行相應的認證操作。總之,@Security 參數在 Swag 中用於指定 API 接口的安全需求和認證要求,幫助開發人員和測試人員快速瞭解 API 接口的安全要求,以及進行相應的測試和調試。
入口註釋
入口註釋通常位於 Go 代碼文件的第一行或者緊跟在包聲明語句後面。它使用特定的格式和指令來描述 API 的基本信息、API 版本、作者、許可證等內容。這些元數據信息會被 Swag 解析並生成對應的 API 文檔。
以下是一個典型的入口註釋的示例:
// Package main provides ...
//
// @title My Awesome API
// @description This is a sample API for demonstration purposes.
// @version 1.0
// @termsOfService https://example.com/terms
// @contact.email admin@example.com
// @license.name MIT
// @host localhost:8080
// @BasePath /api/v1
在上述示例中,入口註釋是以 // 開頭的註釋塊。它包含了各種指令,以 @ 符號開頭,用於描述 API 的各種屬性。
常見的入口註釋指令包括:
- @title:定義 API 的標題或名稱。
- @description:描述 API 的簡要説明。
- @version:指定 API 的版本號。
- @termsOfService:指定服務條款的 URL。
- @contact.email:指定聯繫人的電子郵件地址。
- @license.name:指定 API 的許可證名稱。
- @host:指定 API 的主機名和端口號。
- @BasePath:指定 API 的基本路徑。
通過在入口註釋中使用這些指令,可以為整個 API 定義基本信息,並設置全局配置。Swag 將解析這些註釋並生成對應的 API 文檔,包括標題、描述、版本號、聯繫人信息等。
入口註釋是 Swag 中非常重要的一部分,它提供了定義整個 API 的基本元數據的方式,使得生成的 API 文檔更加規範和易讀。同時,這些元數據也對開發人員和測試人員提供了有用的信息,幫助他們瞭解和使用 API。
生成文檔
go install github.com/swaggo/swag/cmd/swag
swag init
文檔生成完畢後,需要重新啓動項目才會生效。
腳本化
Mac / Linux
swagger.sh
#!/bin/bash
printf "\nRegenerating swagger doc\n\n"
go install github.com/swaggo/swag/cmd/swag@v1.16.2
time swag init
printf "\nDone.\n\n"
Windows
swagger.bat
@echo off
chcp 65001
echo.
echo Regenerating swagger doc
echo.
go install github.com/swaggo/swag/cmd/swag@v1.16.2
swag init
echo.
echo Done.
執行腳本
// Mac / Linux 環境,在項目根目錄下運行
./scripts/swagger.sh
// Windows 環境,在項目根目錄下運行
./scripts/swagger.bat
Git commit 鈎子
Git commit 鈎子是一種在執行 git commit 命令時觸發的自定義腳本或程序,可以讓開發人員在提交代碼之前或之後執行特定的操作。
Git 提供了預定義的一些鈎子點,其中包括 pre-commit 和 post-commit 鈎子,它們分別在執行提交前和提交後觸發。
pre-commit 鈎子:在執行 git commit 前觸發,可以用於在提交前進行代碼風格檢查、靜態代碼分析、單元測試等操作。如果 pre-commit 鈎子中的操作失敗(比如代碼風格不符合規範、單元測試未通過),則會阻止提交的執行。
post-commit 鈎子:在執行 git commit 後觸發,可以用於執行一些與提交相關的操作,比如發送通知、記錄提交信息到日誌、觸發持續集成/部署流程等。
通過使用這些鈎子,開發團隊可以實現一些自動化的流程,例如確保提交的代碼符合規範、自動生成文檔、觸發自動化測試、以及在提交完成後通知團隊成員等。這有助於提高代碼質量、減少人為錯誤,並促進團隊協作。
要使用這些鈎子,只需在項目的 .git/hooks 目錄下創建相應的腳本文件(如 pre-commit 或 post-commit),並賦予執行權限即可。這些腳本可以是任意可執行文件,比如 shell 腳本、Python 腳本等。當執行 git commit 時,Git 會自動觸發相應的鈎子腳本。
我們可以將「生成文檔的腳本」放到 pre-commit 鈎子中,通過在 pre-commit 鈎子中執行文檔生成命令或腳本,可以在每次提交代碼之前自動更新文檔,使得文檔與代碼保持同步。
另外,pre-commit 鈎子還具有一個優勢,即如果文檔生成過程失敗(比如生成命令報錯),它可以阻止提交的執行,確保只有在文檔生成成功的情況下才會提交代碼。
項目代碼
- GitHub: https://github.com/xinliangnote/go-gin-api
- 中文文檔:https://www.yuque.com/xinliangnote/go-gin-api/ngc3x5
有問題,歡迎私信我。