Golang已經(jīng)是一個(gè)很豐富的語(yǔ)言了,包含很多的工具和庫(kù)题山。因?yàn)樽髡呓?jīng)常做Http開(kāi)發(fā)工作胖替,所以先來(lái)探索gin庫(kù)。
熟悉使用
第一步:安裝
$ go get github.com/gin-gonic/gin
第二步:引用
import "github.com/gin-gonic/gin"
第三步:代碼
func main() {
// Disable Console Color
// gin.DisableConsoleColor()
// Creates a gin router with default middleware:
// logger and recovery (crash-free) middleware
router := gin.Default()
router.GET("/someGet", getting)
router.POST("/somePost", posting)
router.PUT("/somePut", putting)
router.DELETE("/someDelete", deleting)
router.PATCH("/somePatch", patching)
router.HEAD("/someHead", head)
router.OPTIONS("/someOptions", options)
// By default it serves on :8080 unless a
// PORT environment variable was defined.
router.Run()
// router.Run(":3000") for a hard coded port
}
使用說(shuō)明
參數(shù)的利用
假設(shè)c *.gin.Context坟岔,那么:
1谒兄、獲取路由參數(shù)是c.Param("name"),例如
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
})
2社付、獲取http的querystring承疲,使用c.Query("name"),例如:
r.GET("/welcome", func(c *gin.Context) {
firstname := c.DefaultQuery("firstname", "Guest")
lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname")
c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
})
3鸥咖、獲取post過(guò)來(lái)的參數(shù)燕鸽,使用c.PostForm("name")
接口版本分組
1、版本是更新?lián)Q代的一個(gè)保證
router := gin.Default()
// Simple group: v1
v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
v1.POST("/submit", submitEndpoint)
v1.POST("/read", readEndpoint)
}
// Simple group: v2
v2 := router.Group("/v2")
{
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
中間件
無(wú)論前后端開(kāi)發(fā)基本都涉及中間件middleware啼辣。不過(guò)路由基本也是一個(gè)middleware啊研,作者把其他middleware都作為路由的一部分了。
r := gin.New()是不包含middleware的鸥拧,而gin.Default是包含logger和recovery中間件的党远。
中間件一般配合分組Group使用,比如
router.GET("/auth/signin", func(c *gin.Context) {
cookie := &http.Cookie{
Name: "session_id",
Value: "user_id",
Path: "/",
HttpOnly: true,
}
http.SetCookie(c.Writer, cookie)
c.String(http.StatusOK, "Login successful")
})
router.GET("/home", AuthMiddleWare(), func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"data": "home"})
})
authorized := router.Group("/", AuthMiddleWare())
func AuthMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
if cookie, err := c.Request.Cookie("session_id"); err == nil {
value := cookie.Value
if logined(value) {
c.Next()
return
}
}
c.JSON(http.StatusUnauthorized, gin.H{
"error": "Unauthorized",
})
c.Abort()
return
}
}