升级路由自动注册以及增加单元测试
This commit is contained in:
parent
f2e180dca8
commit
eb9d6abd4f
@ -7,7 +7,9 @@
|
|||||||
// Date : 2021-03-26 2:06 下午
|
// Date : 2021-03-26 2:06 下午
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import "github.com/gin-gonic/gin"
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
// IApi 每一个接口的实现约束
|
// IApi 每一个接口的实现约束
|
||||||
//
|
//
|
||||||
@ -24,3 +26,10 @@ type IApi interface {
|
|||||||
// 处理的handler
|
// 处理的handler
|
||||||
GetHandler() gin.HandlerFunc
|
GetHandler() gin.HandlerFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RouterFunc 注册路由的函数
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<张德满>
|
||||||
|
//
|
||||||
|
// Date : 3:09 下午 2021/3/26
|
||||||
|
type RouterFunc func() (method string, uri string, handlerFunc gin.HandlerFunc, middlewareList []gin.HandlerFunc)
|
||||||
|
@ -9,9 +9,13 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
|
"reflect"
|
||||||
|
|
||||||
|
"github.com/go-developer/gopkg/gin/util"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/go-developer/gopkg/gin/util"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -33,11 +37,59 @@ func DisableDebugLog() {
|
|||||||
// Author : go_developer@163.com<张德满>
|
// Author : go_developer@163.com<张德满>
|
||||||
//
|
//
|
||||||
// Date : 2:14 下午 2021/3/26
|
// Date : 2:14 下午 2021/3/26
|
||||||
func RegisterRouter(router *gin.Engine, apiInstanceList ...IApi) error {
|
func RegisterRouter(router *gin.Engine, apiInstanceList ...interface{}) error {
|
||||||
for _, apiInstance := range apiInstanceList {
|
for _, apiInstance := range apiInstanceList {
|
||||||
if err := util.RegisterRouter(router, apiInstance.GetMethod(), apiInstance.GetURI(), apiInstance.GetHandler(), apiInstance.GetMiddleWareList()); nil != err {
|
if nil == apiInstance {
|
||||||
routerLog(err)
|
continue
|
||||||
panic(err.Error())
|
}
|
||||||
|
val := reflect.ValueOf(apiInstance)
|
||||||
|
switch val.Kind() {
|
||||||
|
case reflect.Struct:
|
||||||
|
fallthrough
|
||||||
|
case reflect.Ptr:
|
||||||
|
api, ok := apiInstance.(IApi)
|
||||||
|
if ok {
|
||||||
|
if err := util.RegisterRouter(router, api.GetMethod(), api.GetURI(), api.GetHandler(), api.GetMiddleWareList()); nil != err {
|
||||||
|
routerLog(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
routerLog(val.String() + " 注册的路由既不是 IApi 也不是 RouterFunc, 自动识别函数是否包含RouterFunc")
|
||||||
|
// 不是IApi接口,自动识别函数列表 RouterFunc 函数自动注册
|
||||||
|
methodCnt := val.NumMethod()
|
||||||
|
for i := 0; i < methodCnt; i++ {
|
||||||
|
apiFuncList := val.Method(i).Call(nil)
|
||||||
|
for _, apiFuncVal := range apiFuncList {
|
||||||
|
apiFunc, ok := apiFuncVal.Interface().(RouterFunc)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
method, uri, handler, middlewareList := apiFunc()
|
||||||
|
if err := util.RegisterRouter(router, method, uri, handler, middlewareList); nil != err {
|
||||||
|
routerLog(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
routerLog(apiFuncVal.String() + " 自动注册路由成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
case reflect.Func:
|
||||||
|
api, ok := apiInstance.(RouterFunc)
|
||||||
|
if !ok {
|
||||||
|
err := errors.New("注册的路由必须是 IApi 或者 RouterFunc")
|
||||||
|
routerLog(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
method, uri, handler, middlewareList := api()
|
||||||
|
if err := util.RegisterRouter(router, method, uri, handler, middlewareList); nil != err {
|
||||||
|
routerLog(err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
err := errors.New("注册的路由必须是 IApi 或者 RouterFunc")
|
||||||
|
routerLog(err.Error())
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -48,9 +100,9 @@ func RegisterRouter(router *gin.Engine, apiInstanceList ...IApi) error {
|
|||||||
// Author : go_developer@163.com<张德满>
|
// Author : go_developer@163.com<张德满>
|
||||||
//
|
//
|
||||||
// Date : 2:28 下午 2021/3/26
|
// Date : 2:28 下午 2021/3/26
|
||||||
func routerLog(err error) {
|
func routerLog(msg string) {
|
||||||
if !DebugLogEnable || nil == err {
|
if !DebugLogEnable || len(msg) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Fatal(err.Error())
|
log.Print(msg)
|
||||||
}
|
}
|
||||||
|
72
gin/api/register_router_test.go
Normal file
72
gin/api/register_router_test.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
// Package api ...
|
||||||
|
//
|
||||||
|
// Description : 路由注册单元测试
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<张德满>
|
||||||
|
//
|
||||||
|
// Date : 2021-03-26 3:49 下午
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TestRegisterRouter ...
|
||||||
|
//
|
||||||
|
// Author : go_developer@163.com<张德满>
|
||||||
|
//
|
||||||
|
// Date : 3:50 下午 2021/3/26
|
||||||
|
func TestRegisterRouter(t *testing.T) {
|
||||||
|
r := gin.Default()
|
||||||
|
err := RegisterRouter(r, demoApiFunc(), &demoApi{}, &otherApi{}, nil)
|
||||||
|
assert.Nil(t, err, "路由注册异常 : %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func demoApiFunc() RouterFunc {
|
||||||
|
return func() (method string, uri string, handlerFunc gin.HandlerFunc, middlewareList []gin.HandlerFunc) {
|
||||||
|
return http.MethodGet, "/api/func/test", func(context *gin.Context) {
|
||||||
|
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type demoApi struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d demoApi) GetMethod() string {
|
||||||
|
return http.MethodGet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d demoApi) GetURI() string {
|
||||||
|
return "/api/struct/test"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d demoApi) GetMiddleWareList() []gin.HandlerFunc {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d demoApi) GetHandler() gin.HandlerFunc {
|
||||||
|
return func(context *gin.Context) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type otherApi struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (oa *otherApi) DemoApiFunc() RouterFunc {
|
||||||
|
return func() (method string, uri string, handlerFunc gin.HandlerFunc, middlewareList []gin.HandlerFunc) {
|
||||||
|
return http.MethodGet, "/api/other/test", func(context *gin.Context) {
|
||||||
|
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (oa *otherApi) Lala() {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user