• 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

  • 相关阅读:
    Django(69)最好用的过滤器插件Django-filter
    Django(68)drf分页器的使用
    Django(67)drf搜索过滤和排序过滤
    SweetAlert使用
    虚拟环境之间批量pip安装包迁移
    ubuntu 18.04 安装uwsgi 和nginx
    ubuntu 18.04安装mysql及常见问题处理
    ubuntu 18.04安装virtualenv和virtualenvwrapper安装及使用
    滚动视差stellar.js
    JMeter之使用技巧
  • 原文地址:https://www.cnblogs.com/jiujuan/p/9388507.html
Copyright © 2020-2023  润新知