gin框架教程代碼地址:
我們在用http的時候一般都會用一些web框架來進行開發,gin就是這樣的一個框架,它有哪些特點呢
一:gin特點
1、性能優秀
2、基於官方的net/http的有限封裝
3、方便 靈活的中間件
4、數據綁定很強大
5、社區比較活躍
等等
二:gin的安裝
安裝:
go get github.com/gin-gonic/gin
如果要更新:
go get -u github.com/gin-gonic/gin
三:gin的使用
1、入門的第一個示例
先來寫出一個例子:example1.go
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() //listen and serve on 0.0.0.0:8080 }
a. 然后運行 go run example1.go 之后,
b. 在瀏覽器上輸入:http://localhost:8080/ping
輸出結果:
{"message":"pong"}
2: gin的基本路由
// 創建帶有默認中間件的路由: r := gin.Default() //創建不帶中間件的路由: //r := gin.New() r.GET("/someGet", getting) r.POST("/somePost", posting) r.PUT("/somePut", putting) r.DELETE("/someDelete", deleting) r.PATCH("/somePatch", patching) r.HEAD("/someHead", head) r.OPTIONS("/someOptions", options)
3、獲取路由的參數
3.1 Parameters in path
編寫param1.go文件
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() //這個能匹配 /user/tom , 但是不能匹配 /user/ 或 /user r.GET("/user/:name", func(c *gin.Context) { name := c.Param("name") c.String(http.StatusOK, "Hello %s", name) }) //有一個方法可以匹配 /user/tom, 也可以匹配 /user/tom/send //如果沒有任何了路由匹配 /user/tom, 它將會跳轉到 /user/tom/ r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") message := name + " is " + action c.String(http.StatusOK, message) }) r.Run(":8080") }
a. 然后運行 go run param1.go 之后,
b. 在瀏覽器上輸入:http://localhost:8080/user/tom
輸出結果:Hello tom
c. 在瀏覽器上輸入:http://localhost:8080/user/tom/
輸出結果:tom is /
d. 在瀏覽器上輸入:http://localhost:8080/user/tom/pig
輸出結構: tom is /pig
3.2 query param
一般匹配這種形式的url /welcome?firstname=Jane&lastname=Doe
package main //Querystring parameters import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.GET("/welcome", func(c *gin.Context) { firstname := c.DefaultQuery("firstname", "Guest") //如果沒有值,還可以給一個默認值 lastname := c.Query("lastname") c.String(http.StatusOK, "Hello %s %s ", firstname, lastname) }) r.Run(":8080") }
a. 然后運行 go run param2.go 之后,
b. 在瀏覽器上輸入:http://localhost:8080/welcome?lastname=jimmy
輸出結果:Hello Guest jimmy
c. 在瀏覽器上輸入:http://localhost:8080/welcome?lastname=jimmy&firstname=tom
輸出結果:Hello tom jimmy
3.3 表單參數 Form
Multipart/Urlencoded Form
package main import ( "github.com/gin-gonic/gin" // "net/http" ) func main() { r := gin.Default() r.POST("/form_post", func(c *gin.Context) { message := c.PostForm("message") nick := c.DefaultPostForm("nick", "guest") c.JSON(200, gin.H{ "status": "posted", "message": message, "nick": nick, }) }) r.Run(":8080") }
可以用postman來測試一下, 測試結果如下:

3.4 混合型的query + post form
package main import ( // "fmt" "github.com/gin-gonic/gin" ) /* POST /post?id=1234&page=1 HTTP/1.1 Content-Type: application/x-www-form-urlencoded name=manu&message=this_is_great */ func main() { r := gin.Default() r.POST("/post", func(c *gin.Context) { id := c.Query("id") page := c.DefaultQuery("page", "0") name := c.PostForm("name") message := c.PostForm("message") // fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message) c.JSON(200, gin.H{ "id": id, "page": page, "name": name, "message": message, }) }) r.Run(":8080") }
用postman測試結果如下:

4:解析數據綁定
我們可以給一個請求的數據綁定到一個類型,gin支持綁定的類型有JSON,XML和標准的表單數據(foo=bar&boo=baz)。 注意綁定時需要設置綁定類型的標簽。比如綁定json數據時,
設置 json:"fieldname"
package main import ( "github.com/gin-gonic/gin" "net/http" ) // Binding from JSON type User struct { Username string `form:"username" json:"username" binding:"required"` Password string `form:"password" json:"password" binding:"required"` Age int `form:"age" json:"age"` } func main() { r := gin.Default() // Example for binding JSON ({"username": "manu", "password": "123"}) r.POST("/loginJSON", func(c *gin.Context) { var json User if err := c.ShouldBindJSON(&json); err == nil { if json.Username == "manu" && json.Password == "123" { c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) } else { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized", "username": json.Username, "pass": json.Password}) } } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) // Example for binding a HTML form (user=manu&password=123) r.POST("/loginForm", func(c *gin.Context) { var form User if err := c.ShouldBind(&form); err != nil { if form.Username == "manu" && form.Password == "123" { c.JSON(http.StatusOK, gin.H{"status": "you are logged in 2"}) } else { c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized 2"}) } } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) r.Run(":8080") }
還有一些其他的應用,可以參考:
https://github.com/gin-gonic/gin/blob/master/README.md
