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

 

posted @ 2017-06-10 17:08  九卷  阅读(8345)  评论(0编辑  收藏  举报