gin框架教程一: go框架gin的基本使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM