ginbinder 一次绑定 gin request 中的所有需要的数据
2023-02-18 16:39:40 时间
一次绑定 Request 中所有需要的数据
可以用于所有 gin 二开的框架, 只要你能拿到 *gin.Context
github 项目地址: https://github.com/tangx/ginbinder
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/tangx/ginbinder"
)
type paramsDemo1 struct {
Name string `uri:"name"`
Age int `query:"age,default=18"`
Money int32 `query:"money" binding:"required"`
Authorization string `cookie:"Authorization"`
UserAgent string `header:"User-Agent"`
Data struct {
Replicas *int32 `json:"replicas" yaml:"replicas" xml:"replicas" form:"replicas"`
} `body:"body"`
}
func handlerDemo1(c *gin.Context) {
var err error
params := ¶msDemo1{}
err = ginbinder.ShouldBindRequest(c, params)
if err != nil {
c.JSON(http.StatusBadRequest, err)
return
}
c.JSON(200, params)
}
Usage
- 废弃/不可用: 弃用原生 tag
form
tag。 - 保持: 使用 tag
uri
绑定路径中的参数。 作用于某个字段- 就是
example.com/:some/:path
中 冒号后面的
- 就是
- 保持: 使用 tag
header
绑定 header。 作用于某个字段 - 新增: 新增 tag
query
tag 绑定通过 Query 传递的参数。 作用于某个字段- 就是
example.com/some/path?a=1&b=2
中 问号后面的那一串
- 就是
- 新增: 新增 tag
cookie
绑定 cookie 中 简单 的键值对。 作用于某个字段 - 新增: 新增 tag
body
绑定request.Body
中的数据。 必须作用于一个struct
上。- Body 数据的解析器通过
content-type
判断, 默认为Json
- Body 中的字段不能包含
uri, query, cookie, header
这些 tag, 否则会 panic。 body
只能有一个
- Body 数据的解析器通过
按照 Request 结构管理参数
type Params struct {
Name string `uri:"name"`
Age int `query:"age,default=18"`
Money int32 `query:"money" binding:"required"`
Authorization string `cookie:"Authorization"`
UserAgent string `header:"User-Agent"`
Data struct {
Replicas *int32 `json:"replicas" yaml:"replicas" xml:"replicas" form:"replicas"`
} `body:"body"`
}
如果层抓包捕获过 http 请求并观察过其结构。那么应该很好理解这个格式。
这里放一张 Params
与 Request
的关系图以帮助理解。
图中有一个错误,
12/13 行
的tag
应该是query
。
按照 Request 结构设计参数很 常用 也很清晰。
按功能组管理参数
由于 gin 原生中的 mapTag
规则有 递归 的功能, 对 Params
的设计还可以进行一些改造。
可以按组配置 非 body 参数。这里分组的 struct 名字不重要,也不需要为 struct 指定 tag
。但是 一定要 为字段指定了相应的 tag
, 就会进行递归查找与绑定。
1. 按照数据位置进行分组
这里按照 参数 在 Request 中的位置进行分组。
type Params2 struct {
Uris struct {
Name string `uri:"name"`
Age int `uri:"age"`
}
Queries struct {
Age int `query:"age,default=18"`
Money int32 `query:"money" binding:"required"`
}
Cookies struct {
Authorization string `cookie:"Authorization"`
}
Headers struct {
UserAgent string `header:"User-Agent"`
}
BodyData struct {
Replicas *int32 `json:"replicas" yaml:"replicas" xml:"replicas" form:"replicas"`
} `body:"body"`
}
2. 按照功能/业务需求进行分组
这里按照参数的功能进行分组, 加入有一个功能是对用户进行权限验证。需要结合 name 和 auth
type Params3 struct {
Auth struct {
Name string `uri:"name"`
Authorization string `cookie:"Authorization"`
}
BodyData struct {
Replicas *int32 `json:"replicas" yaml:"replicas" xml:"replicas" form:"replicas"`
} `body:"body"`
}
exmaple
Demo 参考 exmaple
使用 VsCode 的 Rest Client 可以快速测试
cd __example__
go run .
相关文章
- java大学校园饭卡管理系统饭卡查询系统饭卡挂失网站源码
- java网上花店源码花店商城网上花店商城购物商场项目花店系统鲜花商城
- java医院挂号系统挂号预约网站挂号网站预约网站源码
- java开发的环保网站垃圾分类系统源码
- kafka 原理深度解读
- kafka 事务介绍
- kafka 结合springboot实战--第一节
- kafka 结合springboot实战--第二节
- kafka 结合springboot实战--第三节
- sentinel 系列-sentinel的介绍及简单使用
- sentinel 持久化
- sentinel 规则配置及使用
- fiddler神器
- 带你领略markdown
- jvm系列之内存区域
- jvm系列之对象
- jvm系列之垃圾收集器
- jvm系列之垃圾收集算法
- jvm系列之类加载机制
- JDK动态代理