
2024年在線市場平臺的11大最佳支付解決方案
之后使用go mod download
命令下載。
或者在項(xiàng)目目錄中直接運(yùn)行?go get github.com/gin-gonic/gin@v1.7.4
?命令,也會下載gin包,并且會自動添加到go.mod 文件中。
新建一個(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",
})
})
默認(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)
上面的代碼都是以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
}
}
上面的代碼在處理請求的時(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年在線市場平臺的11大最佳支付解決方案
完整指南:如何在應(yīng)用程序中集成和使用ChatGPT API
選擇AI API的指南:ChatGPT、Gemini或Claude,哪一個(gè)最適合你?
用ASP.NET Core 2.1 建立規(guī)范的 REST API — 緩存和并發(fā)
企業(yè)工商數(shù)據(jù)API用哪種?
2024年創(chuàng)建社交媒體帖子的最佳圖像工具API
2024年小型企業(yè)的7個(gè)最佳短信應(yīng)用API
用gin寫簡單的crud后端API接口
最新LangChain+GLM4開發(fā)AI應(yīng)用程序系列(一):快速入門篇