go 1.15

require (
github.com/gin-gonic/gin v1.7.4
)

之后使用go mod download 命令下載。

或者在項(xiàng)目目錄中直接運(yùn)行?go get github.com/gin-gonic/gin@v1.7.4?命令,也會下載gin包,并且會自動添加到go.mod 文件中。

構(gòu)建http 服務(wù)

新建一個(gè)server.go 文件,寫入以下代碼

package main

import "github.com/gin-gonic/gin"

func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"Msg":"Hello World",
})
})
r.Run(":8080")
}

代碼很簡單,運(yùn)行go run server.go?則會在8080端口啟動一個(gè)http服務(wù),使用瀏覽器訪問?http://127.0.0.1:8080/?則會返回json的數(shù)據(jù)

{
Msg: "Hello world"
}

上面代碼中,使用gin.Default() 創(chuàng)建一個(gè)默認(rèn)的gin應(yīng)用,這個(gè)應(yīng)用底層初始化了很多設(shè)置,這里就先不深入探索了。

這里就注冊了一個(gè)路由,/,它的處理由一個(gè)匿名函數(shù)來處理, gin 中的GET方法的定義為

// GET is a shortcut for router.Handle("GET", path, handle).
func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
return group.handle(http.MethodGet, relativePath, handlers)
}

handler 為處理方法,該方法的定義為

type HandlerFunc func(*Context)

所以這里需要一個(gè)參數(shù)為(*Context) 的函數(shù),上面的代碼中使用

func(c *gin.Context) {
c.JSON(200, gin.H{
"Msg":"Hello World",
})
}

這個(gè)匿名函數(shù)來處理 /  的GET請求。

這里還可以定義POST、DELETE、PUT 等方法,這樣可以很方便的編寫restful 風(fēng)格的API,

r.POST("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"Msg":"Hello world POST",
})
})

404 配置

默認(rèn)的404處理,會打印 404 not found,更多的時(shí)候,我們想自定義404頁面的處理,這時(shí)可以通過設(shè)置r.NoRoute?方法來實(shí)現(xiàn)

r.NoRoute(func(c *gin.Context) {
c.JSON(404, gin.H{
"Msg": "The page not found",
})
})

這時(shí)在訪問一個(gè)不存在的路由時(shí)會展示自定義的內(nèi)容。

路由組

很多時(shí)候,我們是有這樣的需求,訪問的路由前面都有統(tǒng)一的前綴,如/api/v1?, 或者/user?,當(dāng)然可以在定義路由的時(shí)候都統(tǒng)一寫上前綴,但是這種方式,如果后期修改了前綴將要改好多地方。這里可以使用路由組的概念。

func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"Msg": "Hello world",
})
})
apiv1 := r.Group("/api/v1")
{
apiv1.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"msg": "hello api v1"})
})
}
r.Run(":8080")
}

以上代碼,定義了一個(gè)路由組,/api/v1??, 之后又會在該路由組下定義相應(yīng)的處理方法,這里區(qū)分?http://127.0.0.1:8080/?這個(gè)url 返回?"Msg": "Hello world", ?/api/v1/?這個(gè)路由返回?"msg": "hello api v1"

處理類的封裝

上面的路由的處理類都是使用匿名函數(shù),處理的邏輯比較簡單的話,可以這么寫,但是還是不建議寫個(gè)匿名函數(shù)來處理,之后隨著項(xiàng)目越來越大,這里的路由定義會越來越多,如果還有大量的匿名函數(shù)的話,看著就會比較亂。

這里我們可以將處理handler 進(jìn)行封裝。

先創(chuàng)建一個(gè)handlers 的文件夾,寫入以下代碼

package handlers

import "github.com/gin-gonic/gin"

type ApiV1 struct {

}

func (ApiV1) Get(c *gin.Context) {
c.JSON(200, gin.H{"msg": "handlers get request!"})
}

這里定義了一個(gè)ApiV1的結(jié)構(gòu)體, 之后定義了一個(gè)Get 方法,然后在入口 server.go 文件中,修改原來的代碼,

func main() {
r := gin.Default()
apiv1_h := handlers.ApiV1{}
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"Msg": "Hello world",
})
})
apiv1 := r.Group("/api/v1")
{
apiv1.GET("/", apiv1_h.Get)
}
r.Run(":8080")
}

使用apiv1_h := handlers.ApiV1{}?初始化一個(gè)ApiV1的結(jié)構(gòu)體對象,在之后路由定義的時(shí)候,就可以直接使用該對象的Get方法,最好將相同前綴的放入一個(gè)括號中{},方法查看

{
apiv1.GET("/", apiv1_h.Get)
}

這里注意,處理handler 為?apiv1_h.Get?, 而不是?apiv1_h.Get(c, *gin.Context)

使用 http.Server 啟動服務(wù)

上面的代碼都是以r.run(":8080")?的方式啟動服務(wù),但是有時(shí)候我們希望做一些個(gè)性化的設(shè)置,如一些讀寫超時(shí),當(dāng)然也可以調(diào)用gin.New()?方法中得到的對象中進(jìn)行設(shè)置,也可以直接使用http.Server?中定義。

func main() {
r := gin.Default()
apiv1_h := handlers.ApiV1{}
apiv1 := r.Group("/api/v1")
{
apiv1.GET("/", apiv1_h.Get)
}
s := &http.Server{
Addr: ":8080",
Handler: r,
ReadTimeout: 10*time.Second,
WriteTimeout: 10*time.Second,
}
err := s.ListenAndServe()
if err != nil {
return
}
}

網(wǎng)頁跳轉(zhuǎn)

上面的代碼在處理請求的時(shí)候,都是返回json數(shù)據(jù),由于現(xiàn)在主流開發(fā)使用前后端分離的模式,所以這里不太使用html 模板的方式返回?cái)?shù)據(jù)了。

當(dāng)使用第三方登錄的時(shí)候,全牽扯到網(wǎng)頁跳轉(zhuǎn),網(wǎng)頁跳轉(zhuǎn)也非常簡單, 修改apiv1.go 文件

package handlers

import "github.com/gin-gonic/gin"

type ApiV1 struct {

}

func (*ApiV1) Get(c *gin.Context) {
c.Redirect(301, "https://www.baidu.com")
}

這樣在方法的對應(yīng)的路由的時(shí)候,就會跳轉(zhuǎn)到百度了。

這里要注意,狀態(tài)碼必須處理300-308之間,否則會報(bào)錯(cuò)

func (r Redirect) Render(w http.ResponseWriter) error {
if (r.Code < http.StatusMultipleChoices || r.Code > http.StatusPermanentRedirect) && r.Code != http.StatusCreated {
panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code))
}
http.Redirect(w, r.Request, r.Location, r.Code)
return nil
}

gin 框架的基本搭建先記錄到這里,之后會介紹各種請求參數(shù)的獲取與校驗(yàn)。

文章轉(zhuǎn)自微信公眾號@序語程言

上一篇:

2024年及以后B2B電商的11大卓越趨勢

下一篇:

為開源項(xiàng)目 go-gin-api 增加 WebSocket 模塊
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)