天天看点

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

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

背景

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

组件基本信息

  • 组件:​​ginhelper​​
  • 开源协议:​​MIT license​​

内容

本节分享一个利用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 protected]",
  },
 }, 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

88x31.png

​​知识共享许可协议​​