组件分享之后端组件——利用Go的反射实现Gin路由的自动添加小组件ginhelper

背景

近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。

组件基本信息

内容

本节分享一个利用Go的反射实现Gin路由的自动添加小组件​​ginhelper​​,它可以整合gin的参数绑定与路由设置和非注释自动生成swagger。

其中结构体划分如下:

// GroupRouter 路由组
type GroupRouter struct {
Path string // 路由组的根路径,与Gin的Group一样,定义一组接口的公共路径
Name string // 路由组的名称
Routes []*Route // 路由组中的具体路由
}
// Router 路由
type Route struct {
Param Parameter // 接口的参数实现
Path string // 接口的路径
Method string // 接口的方法
Handlers []gin.HandlerFunc // 接口的额外处理函数
}
// 参数绑定
// 为了成功绑定参数,并降低代码的重复度,需要参数实现Parameter接口:
type Parameter interface {
Bind(c *gin.Context, p Parameter) (err error) //绑定参数
Handler(c *gin.Context) (data Data, err error) //执行具体业务
Result(c *gin.Context, data Data, err error) //结果返回
}

具体使用方式如下:

// 定义一个Group
var testGroup = &ginhelper.GroupRouter{
Path: "test",
Name: "Mytest",
Routes: []*ginhelper.Route{
{
Param: new(testBodyParam),
Path: "/hello/:id",
Method: "POST",
}},
}

type FooStruct struct {
FooA string `binding:"required" `
FooB *bool `binding:"required"`
}

// 接口的参数
type testBodyParam struct {
ginhelper.BaseParam `json:"-"`
Foo string `binding:"required"`
FooName string `json:"fName" binding:"required"`
FooInt int `binding:"required"`
FooIgnore string `json:"-"`
FooStruct
FooStruct2 FooStruct
FooStruct3 *FooStruct
}

func (param *testBodyParam) Handler(c *gin.Context) (data ginhelper.Data, err error) {
return param, nil
}


func Example() {
router := gin.Default()
r := router.Group("api")
// 如果不需要swagger,可以使用New初始化
h := ginhelper.NewWithSwagger(&ginhelper.SwaggerInfo{
Description: "swagger test page",
Title: "Swagger Test Page",
Version: "0.0.1",
ContactInfoProps: ginhelper.ContactInfoProps{
Name: "zzj",
URL: "https://zzj.cool",
Email: "email@zzj.cool",
},
}, r)
h.Add(testGroup, r)
_ = router.Run(":8888")
}

如果开启了swagger的话,访问​​http://127.0.0.1:8888/api/swagger​​即可。

本文参考内容
​​​https://zhuanlan.zhihu.com/p/95597380​​​​https://github.com/zzjcool/ginHelper​

更多前后端组件,可以持续关注我,我将持续给大家分享各种各样的组件包。

本文声明:

组件分享之后端组件——利用Go的反射实现Gin路由的自动添加小组件ginhelper_json

88x31.png


​知识共享许可协议​

本作品由 ​​cn華少​​ 采用 ​​知识共享署名-非商业性使用 4.0 国际许可协议​​ 进行许可。