Golang的HTTP路由Gin

Golang已经是一个很丰富的语言了,包含很多的工具和库。因为作者经常做Http开发工作,所以先来探索gin库。

熟悉使用

第一步:安装

 $ 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
}

使用说明

参数的利用

假设c *.gin.Context,那么:
1、获取路由参数是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过来的参数,使用c.PostForm(“name”)

接口版本分组

1、版本是更新换代的一个保证

    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)
    }

中间件

无论前后端开发基本都涉及中间件middleware。不过路由基本也是一个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
    }
}
    原文作者:leegoway
    原文地址: https://www.jianshu.com/p/b89783a8b480
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞