Gin框架学习(五)

简介: 来这里学Gin框架,目标明确不迷茫。

学习思维导图

Gin框架思维导图

提高篇

请求参数

获取URL请求参数

func main() {
    r := gin.Default()
    //GET获取URL请求参数
    r.GET("/Get", func(c *gin.Context) {
         //查询请求URL后面的参数,如果没有填写默认值
        DefaultQuery := c.DefaultQuery("Value1", "nil"))
        //查询请求URL后面的参数
        Query := c.Query("Value2") 
        c.String(http.StatusOK, "%s %s", DefaultQuery, Query)
    })
    //DELETE获取URL请求参数
    r.DELETE("/DELETE", func(c *gin.Context) {
         //查询请求URL后面的参数,如果没有填写默认值
        DefaultQuery := c.DefaultQuery("Value3", "nil")
        //查询请求URL后面的参数
        Query := c.Query("Value4") 
        c.String(http.StatusOK, "%s %s", DefaultQuery, Query)
    })
    r.Run()
}

获取表单请求参数

func main() {
    router := gin.Default()
    //POST获取表单请求参数
    r.POST("/POST", func(c *gin.Context) {
         //从表单中查询参数,,如果没有就获取默认值
        DefaultPostForm := c.DefaultPostForm("Value1", "nil")
        //从表单中查询参数
        PostForm := c.PostForm("Value2")
        c.JSON(200, gin.H{
            "status": "post",
            "DefaultPostForm": DefaultPostForm,
            "PostForm": PostForm,
        })
    })
    //PUT获取表单请求参数
    r.PUT("/PUT", func(c *gin.Context) {
         //从表单中查询参数,,如果没有就获取默认值
        DefaultPostForm := c.DefaultPostForm("Value3", "nil")
        //从表单中查询参数
        PostForm := c.PostForm("Value4")
        c.JSON(200, gin.H{
            "status": "post",
            "DefaultPostForm": DefaultPostForm,
            "PostForm": PostForm,
        })
    })
    r.Run()
}

参数绑定Gin框架Bind

Json数据格式

package main
import (
    "github.com/gin-gonic/gin"
    "fmt"
)
type PostParams struct {
    Name string `json:"name"` 
    Age  int    `json:"age"`
    Sex  bool   `json:"sex"`
}
func main() {
    r := gin.Default()
    //ShouldBindJSON数据绑定
    r.POST("/BindJSON", func(c *gin.Context) {
        var p PostParams
        //ShouldBindJSON参数绑定
        err := c.ShouldBindJSON(&p)
        if err != nil {
            fmt.println(err.Error())
            c.JSON(200, gin.H{
                "msg":  "bindjson报错了",
                "data": gin.H{},
            })
        } else {
            c.JSON(200, gin.H{
                "msg":  "bindjson请求成功",
                "data": p, //如果请求成功则把p的值打印出来
            })
        }
    })
    r.Run()
}

From数据格式

package main
import (
    "github.com/gin-gonic/gin"
    "fmt"
)
type PostParams struct{
    Name string `json:"name"  form:"name"`
    Age int `json:"age" form:"age"`
    Sex bool `json:"sex" form:"sex"`
}
func main() {
    r := gin.Default()
    var p PostParams
    r.GET("/BindFrom", func(c *gin.Context) {
        //ShouldBind参数绑定
        err := c.ShouldBind(&p)
        if err != nil {
            fmt.println(err.Error())
            c.JSON(200, gin.H{
                "msg":  "bindfrom报错了",
                "data": gin.H{},
            })
        } else {
            c.JSON(200, gin.H{
                "msg":  "bindfrom请求成功",
                "data": p, //如果请求成功则把u的值打印出来
            })
        }
    })
    r.Run()
}

Uri数据格式

package main
import (
    "github.com/gin-gonic/gin"
    "fmt"
)
type PostParams struct{
    Name string `json:"name"  uri:"name"`
    Age int `json:"age" uri:"age"`
    Sex bool `json:"sex" uri:"sex"`
}

func main(){
    r := gin.Default()
    //shouldbinduri数据绑定
    r.POST("/testBind/:name/:age/:sex", func(c *gin.Context){
        var p PostParams
        err := c.ShouldBindUri(&p)
        if err !=nil{
            fmt.println(err.Error())
            c.JSON(200, gin.H{
                "msg": "binduri报错了",
                "data": gin.H{},
            })
        }else{
            c.JSON(200, gin.H{
                "msg": "binduri请求成功",
                "data": p, //如果请求成功则把p的值打印出来
            })
        }
    })
    r.Run()
}

参数校验

普通情况

满足格式接收,可以不用解析数据,减少if else,会简洁许多。

package main
import (
    "fmt"
    "time"
    "github.com/gin-gonic/gin"
)
//Person ..
type Person struct {
    //不能为空并且大于10
    Age      int       `form:"age" binding:"required,gt=10"`
    Name     string    `form:"name" binding:"required"`
    Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"`
}
func main() {
    r := gin.Default()
    r.GET("/test", func(c *gin.Context) {
        var person Person
        if err := c.ShouldBind(&person); err != nil {
            c.String(500, fmt.Sprint(err))
            return
        }
        c.String(200, fmt.Sprintf("%#v", person))
    })
    r.Run()
}

自定义情况

V8依赖包:gopkg.in/go-playground/validator.v8
V10依赖包:gopkg.in/go-playground/validator.v10

package main

import (
    "net/http"
    "reflect"
    "github.com/gin-gonic/gin"
    "github.com/gin-gonic/gin/binding"
    "gopkg.in/go-playground/validator.v8"
)
'''
    对绑定解析到结构体上的参数,自定义验证功能
    比如我们要对 name 字段做校验,要不能为空,并且不等于 admin ,类似这种需求,就无法 binding 现成的方法
    需要我们自己验证方法才能实现 官网示例(https://godoc.org/gopkg.in/go-playground/validator.v8#hdr-Custom_Functions)
    这里需要下载引入下 gopkg.in/go-playground/validator.v8
'''
type Person struct {
    Age int `form:"age" binding:"required,gt=10"`
    // 2、在参数 binding 上使用自定义的校验方法函数注册时候的名称
    Name    string `form:"name" binding:"NotNullAndAdmin"`
    Address string `form:"address" binding:"required"`
}

// 1、自定义的校验方法
func nameNotNullAndAdmin(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
    if value, ok := field.Interface().(string); ok {
        // 字段不能为空,并且不等于  admin
        return value != "" && !("5lmh" == value)
    }
    return true
}
func main() {
    r := gin.Default()
    // 3、将我们自定义的校验方法注册到 validator中
    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        // 这里的 key 和 fn 可以不一样最终在 struct 使用的是 key
        v.RegisterValidation("NotNullAndAdmin", nameNotNullAndAdmin)
    }
    r.GET("/test", func(c *gin.Context) {
        var person Person
        if e := c.ShouldBind(&person); e == nil {
            c.String(http.StatusOK, "%v", person)
        } else {
            c.String(http.StatusOK, "person bind err:%v", e.Error())
        }
    })
    r.Run()
}

后记

喜欢的话可以三连,后续继续更新其他内容,帮忙推一推,感谢观看!

相关文章
|
Go API 网络架构
Gin框架快速入门1
Gin框架快速入门1
130 0
|
SQL 关系型数据库 MySQL
gin框架学习-Gorm入门指南
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
482 0
gin框架学习-Gorm入门指南
|
6月前
|
Go
gin初体验
gin初体验
|
6月前
|
JSON 中间件 API
Gin框架笔记(一) Gin框架的安装与Hello World
Gin框架笔记(一) Gin框架的安装与Hello World
230 0
|
6月前
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
285 0
|
6月前
|
前端开发 中间件 关系型数据库
|
6月前
|
JSON 前端开发 Java
|
Go API
gin框架学习-快速安装gin
Gin 是一个用 Go (Golang) 编写的 Web 框架,由于 httprouter,它具有 martini 的 API,性能提高了 40 倍。具有高性能的优点。
168 0
gin框架学习-快速安装gin
|
存储 前端开发
gin框架学习-文件上传
多文件上传就是一次可以上传多个文件,不需要一个文件一个文件上传,这也便于上传文件的人。
239 0
gin框架学习-文件上传
|
开发工具
基于Gin封装Web框架 - 3. 初始化 rum 框架
基于Gin封装Web框架 - 3. 初始化 rum 框架
192 0
基于Gin封装Web框架 - 3. 初始化 rum 框架