欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang組件swagger生成接口文檔實踐示例

 更新時間:2022年04月16日 14:01:19   作者:Jeff的技術(shù)棧  
這篇文章主要為大家介紹了golang組件swagger生成接口文檔實踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

swagger介紹

Swagger本質(zhì)上是一種用于描述使用JSON表示的RESTful API的接口描述語言。Swagger與一組開源軟件工具一起使用,以設(shè)計、構(gòu)建、記錄和使用RESTful Web服務(wù)。Swagger包括自動文檔,代碼生成和測試用例生成。

在前后端分離的項目開發(fā)過程中,如果后端同學(xué)能夠提供一份清晰明了的接口文檔,那么就能極大地提高大家的溝通效率和開發(fā)效率??墒蔷帉懡涌谖臋n歷來都是令人頭痛的,而且后續(xù)接口文檔的維護也十分耗費精力。

最好是有一種方案能夠既滿足我們輸出文檔的需要又能隨代碼的變更自動更新,而Swagger正是那種能幫我們解決接口文檔問題的工具。

這里以gin框架為例,使用gin-swagger庫以使用Swagger 2.0自動生成RESTful API文檔。

gin-swagger實戰(zhàn)

想要使用gin-swagger為你的代碼自動生成接口文檔,一般需要下面三個步驟:

  • 按照swagger要求給接口代碼添加聲明式注釋,具體參照聲明式注釋格式。
  • 使用swag工具掃描代碼自動生成API接口文檔數(shù)據(jù)
  • 使用gin-swagger渲染在線接口文檔頁面

第一步:添加注釋

在程序入口main函數(shù)上以注釋的方式寫下項目相關(guān)介紹信息。

package main
// @title 這里寫標(biāo)題
// @version 1.0
// @description 這里寫描述信息
// @termsOfService http://swagger.io/terms/
// @contact.name 這里寫聯(lián)系人信息
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
// @host 這里寫接口服務(wù)的host
// @BasePath 這里寫base path
func main() {
	r := gin.New()
	// liwenzhou.com ...
	r.Run()
}

在你代碼中處理請求的接口函數(shù)(通常位于controller層)按如下方式寫上注釋:

// GetPostListHandler2 升級版帖子列表接口
// @Summary 升級版帖子列表接口
// @Description 可按社區(qū)按時間或分數(shù)排序查詢帖子列表接口
// @Tags 帖子相關(guān)接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 用戶令牌"
// @Param object query models.ParamPostList false "查詢參數(shù)"
// @Security ApiKeyAuth
// @Success 200 {object} _ResponsePostList
// @Router /posts2 [get]
func GetPostListHandler2(c *gin.Context) {
	// GET請求參數(shù)(query string):/api/v1/posts2?page=1&size=10&order=time
	// 初始化結(jié)構(gòu)體時指定初始參數(shù)
	p := &models.ParamPostList{
		Page:  1,
		Size:  10,
		Order: models.OrderTime,
	}
	if err := c.ShouldBindQuery(p); err != nil {
		zap.L().Error("GetPostListHandler2 with invalid params", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	data, err := logic.GetPostListNew(p)
	// 獲取數(shù)據(jù)
	if err != nil {
		zap.L().Error("logic.GetPostList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy)
		return
	}
	ResponseSuccess(c, data)
	// 返回響應(yīng)
}

上面注釋中參數(shù)類型使用了object,models.ParamPostList具體定義如下:

// bluebell/models/params.go
// ParamPostList 獲取帖子列表query string參數(shù)
type ParamPostList struct {
	CommunityID int64  `json:"community_id" form:"community_id"`   // 可以為空
	Page        int64  `json:"page" form:"page" example:"1"`       // 頁碼
	Size        int64  `json:"size" form:"size" example:"10"`      // 每頁數(shù)據(jù)量
	Order       string `json:"order" form:"order" example:"score"` // 排序依據(jù)
}

響應(yīng)數(shù)據(jù)類型也使用的object,我個人習(xí)慣在controller層專門定義一個docs_models.go文件來存儲文檔中使用的響應(yīng)數(shù)據(jù)model。

// bluebell/controller/docs_models.go
// _ResponsePostList 帖子列表接口響應(yīng)數(shù)據(jù)
type _ResponsePostList struct {
	Code    ResCode                 `json:"code"`    // 業(yè)務(wù)響應(yīng)狀態(tài)碼
	Message string                  `json:"message"` // 提示信息
	Data    []*models.ApiPostDetail `json:"data"`    // 數(shù)據(jù)
}

第二步:生成接口文檔數(shù)據(jù)

編寫完注釋后,使用以下命令安裝swag工具:

go get -u github.com/swaggo/swag/cmd/swag

在項目根目錄執(zhí)行以下命令,使用swag工具生成接口文檔數(shù)據(jù)。

swag init

執(zhí)行完上述命令后,如果你寫的注釋格式?jīng)]問題,此時你的項目根目錄下會多出一個docs文件夾。

./docs
├── docs.go
├── swagger.json
└── swagger.yaml

第三步:引入gin-swagger渲染文檔數(shù)據(jù)

然后在項目代碼中注冊路由的地方按如下方式引入gin-swagger相關(guān)內(nèi)容:

import (
	// liwenzhou.com ...
	_ "bluebell/docs"  // 千萬不要忘了導(dǎo)入把你上一步生成的docs
	gs "github.com/swaggo/gin-swagger"
	"github.com/swaggo/gin-swagger/swaggerFiles"
	"github.com/gin-gonic/gin"
)

注冊swagger api相關(guān)路由

r.GET("/swagger/*any", gs.WrapHandler(swaggerFiles.Handler))

把你的項目程序運行起來,打開瀏覽器訪問http://localhost:8080/swagger/index.html就能看到Swagger 2.0 Api文檔了。

gin-swagger同時還提供了DisablingWrapHandler函數(shù),方便我們通過設(shè)置某些環(huán)境變量來禁用Swagger。例如:

r.GET("/swagger/*any", gs.DisablingWrapHandler(swaggerFiles.Handler, "NAME_OF_ENV_VARIABLE"))

此時如果將環(huán)境變量NAME_OF_ENV_VARIABLE設(shè)置為任意值,則/swagger/*any將返回404響應(yīng),就像未指定路由時一樣。

以上就是golang組件swagger生成接口文檔實踐示例的詳細內(nèi)容,更多關(guān)于golang組件swagger生成接口文檔實的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 適合PHP同學(xué)的GoFrame框架使用體驗及學(xué)習(xí)建議

    適合PHP同學(xué)的GoFrame框架使用體驗及學(xué)習(xí)建議

    這篇文章主要為大家介紹了非常適合PHP同學(xué)使用的GoFrame框架設(shè)計思想使用體驗及學(xué)習(xí)建議介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Golang中指針的使用詳解

    Golang中指針的使用詳解

    Golang是一門支持指針的編程語言,指針是一種特殊的變量,存儲了其他變量的地址。通過指針,可以在程序中直接訪問和修改變量的值,避免了不必要的內(nèi)存拷貝和傳遞。Golang中的指針具有高效、安全的特點,在并發(fā)編程和底層系統(tǒng)開發(fā)中得到廣泛應(yīng)用
    2023-04-04
  • Golang 實現(xiàn) RTP音視頻傳輸示例詳解

    Golang 實現(xiàn) RTP音視頻傳輸示例詳解

    這篇文章主要為大家介紹了Golang實現(xiàn)RTP音視頻傳輸?shù)氖纠斀猓行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • golang并發(fā)編程的實現(xiàn)

    golang并發(fā)編程的實現(xiàn)

    這篇文章主要介紹了golang并發(fā)編程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 利用Go語言實現(xiàn)二叉搜索樹

    利用Go語言實現(xiàn)二叉搜索樹

    二叉樹是一種常見并且非常重要的數(shù)據(jù)結(jié)構(gòu),在很多項目中都能看到二叉樹的身影,當(dāng)然它也有很多變種,本文要介紹的是二叉搜索樹的實現(xiàn),希望對大家有所幫助
    2023-07-07
  • Go中跨域Cors中間件的實現(xiàn)

    Go中跨域Cors中間件的實現(xiàn)

    本文主要介紹了Go中跨域Cors中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • golang時間、時區(qū)、格式的使用方法

    golang時間、時區(qū)、格式的使用方法

    這篇文章主要介紹了golang時間、時區(qū)、格式的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 細說Go語言中空結(jié)構(gòu)體的奇妙用途

    細說Go語言中空結(jié)構(gòu)體的奇妙用途

    Go語言中,我們可以定義空結(jié)構(gòu)體,即沒有任何成員變量的結(jié)構(gòu)體,使用關(guān)鍵字?struct{}?來表示。這種結(jié)構(gòu)體似乎沒有任何用處,但實際上它在?Go?語言中的應(yīng)用非常廣泛,本文就來詳解講講
    2023-05-05
  • Go創(chuàng)建一個包并使用(導(dǎo)入本地包和注意事項)

    Go創(chuàng)建一個包并使用(導(dǎo)入本地包和注意事項)

    有時候需要自己寫一個包方便多次使用,但是在導(dǎo)入自己寫的包時遇到了問題,本文主要介紹了Go創(chuàng)建一個包并使用(導(dǎo)入本地包和注意事項),感興趣的可以了解一下
    2023-11-11
  • go gin中間件關(guān)于 c.next()、c.abort()和return的使用小結(jié)

    go gin中間件關(guān)于 c.next()、c.abort()和return的使用小結(jié)

    中間件的執(zhí)行順序是按照注冊順序執(zhí)行的,中間件可以通過 c.abort() + retrurn 來中止當(dāng)前中間件,后續(xù)中間件和處理器的處理流程,?這篇文章給大家介紹go gin中間件關(guān)于 c.next()、c.abort()和return的使用小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評論