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()
}

后记

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

相关文章
|
6月前
|
Go API 网络架构
Gin框架快速入门1
Gin框架快速入门1
61 0
|
6月前
|
XML JSON 前端开发
Gin快速入门2
Gin快速入门2
49 0
|
SQL 关系型数据库 MySQL
gin框架学习-Gorm入门指南
Snake Case命名风格,就是各个单词之间用下划线(_)分隔,首字母大写区分一个单词,例如: CreateTime的Snake Case风格命名为create_time
299 0
gin框架学习-Gorm入门指南
|
API Go 网络架构
Kratos 大乱炖 —— 整合其他Web框架:Gin、FastHttp、Hertz
Kratos默认的RPC框架使用的是gRPC,支持REST和protobuf两种通讯协议。其API都是使用protobuf定义的,REST协议是通过[grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway)转译实现的。使用protobuf定义API是具有极大优点的,具有很强的可读性、可维护性,以及工程性。工程再大,人员再多,也不会乱。 一切看起来都是很美好的。那么,问题来了,我们现在使用的是其他的Web框架,迁移就会有成本,有风险,不可能一下子就把历史存在的代码一口气转换过来到Kratos框架。那我可以在Kratos中整合其他
774 0
|
Go API
gin框架学习-快速安装gin
Gin 是一个用 Go (Golang) 编写的 Web 框架,由于 httprouter,它具有 martini 的 API,性能提高了 40 倍。具有高性能的优点。
132 0
gin框架学习-快速安装gin
|
存储 前端开发
gin框架学习-文件上传
多文件上传就是一次可以上传多个文件,不需要一个文件一个文件上传,这也便于上传文件的人。
183 0
gin框架学习-文件上传
|
JSON 前端开发 关系型数据库
gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务
创建包管理工具,此命令会在当前目录中初始化和创建一个新的go.mod文件,手动创建go.mod文件再包含一些module声明也等同该命令,而go mod init命令便是帮我们简便操作,可以帮助我们自动创建。
463 0
gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务
|
中间件 Go 数据格式
gin框架中间件深度解析
gin框架中间件深度解析
210 1
gin框架中间件深度解析
基于Gin封装Web框架 - 3. 初始化 rum 框架
基于Gin封装Web框架 - 3. 初始化 rum 框架
154 0
基于Gin封装Web框架 - 3. 初始化 rum 框架
|
Go PHP
Gin从入门到精通—如何理解安装Gin并在本地运行
Gin从入门到精通—如何理解安装Gin并在本地运行
424 0
Gin从入门到精通—如何理解安装Gin并在本地运行