升级路由自动注册以及增加单元测试
This commit is contained in:
		| @ -7,7 +7,9 @@ | ||||
| // Date : 2021-03-26 2:06 下午 | ||||
| package api | ||||
|  | ||||
| import "github.com/gin-gonic/gin" | ||||
| import ( | ||||
| 	"github.com/gin-gonic/gin" | ||||
| ) | ||||
|  | ||||
| // IApi 每一个接口的实现约束 | ||||
| // | ||||
| @ -24,3 +26,10 @@ type IApi interface { | ||||
| 	// 处理的handler | ||||
| 	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 ( | ||||
| 	"log" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"github.com/go-developer/gopkg/gin/util" | ||||
|  | ||||
| 	"github.com/pkg/errors" | ||||
|  | ||||
| 	"github.com/gin-gonic/gin" | ||||
| 	"github.com/go-developer/gopkg/gin/util" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| @ -33,11 +37,59 @@ func DisableDebugLog() { | ||||
| // Author : go_developer@163.com<张德满> | ||||
| // | ||||
| // 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 { | ||||
| 		if err := util.RegisterRouter(router, apiInstance.GetMethod(), apiInstance.GetURI(), apiInstance.GetHandler(), apiInstance.GetMiddleWareList()); nil != err { | ||||
| 			routerLog(err) | ||||
| 			panic(err.Error()) | ||||
| 		if nil == apiInstance { | ||||
| 			continue | ||||
| 		} | ||||
| 		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 | ||||
| @ -48,9 +100,9 @@ func RegisterRouter(router *gin.Engine, apiInstanceList ...IApi) error { | ||||
| // Author : go_developer@163.com<张德满> | ||||
| // | ||||
| // Date : 2:28 下午 2021/3/26 | ||||
| func routerLog(err error) { | ||||
| 	if !DebugLogEnable || nil == err { | ||||
| func routerLog(msg string) { | ||||
| 	if !DebugLogEnable || len(msg) == 0 { | ||||
| 		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() { | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user