finish router get example
This commit is contained in:
		
							parent
							
								
									9b3a79772b
								
							
						
					
					
						commit
						07d0dccd89
					
				| @ -20,6 +20,7 @@ import ( | |||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"path" | 	"path" | ||||||
| 	"reflect" | 	"reflect" | ||||||
|  | 	"runtime" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| @ -275,7 +276,7 @@ func (p *ControllerRegister) addWithMethodParams(pattern string, c ControllerInt | |||||||
| 	for i := range opts { | 	for i := range opts { | ||||||
| 		opts[i](route) | 		opts[i](route) | ||||||
| 	} | 	} | ||||||
| 	 | 
 | ||||||
| 	globalSessionOn := p.cfg.WebConfig.Session.SessionOn | 	globalSessionOn := p.cfg.WebConfig.Session.SessionOn | ||||||
| 	if !globalSessionOn && route.sessionOn { | 	if !globalSessionOn && route.sessionOn { | ||||||
| 		logs.Warn("global sessionOn is false, sessionOn of router [%s] can't be set to true", route.pattern) | 		logs.Warn("global sessionOn is false, sessionOn of router [%s] can't be set to true", route.pattern) | ||||||
| @ -332,6 +333,93 @@ func (p *ControllerRegister) GiveBackContext(ctx *beecontext.Context) { | |||||||
| 	p.pool.Put(ctx) | 	p.pool.Put(ctx) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // RouterGet add post method | ||||||
|  | // usage: | ||||||
|  | //    type MyController struct { | ||||||
|  | //	     web.Controller | ||||||
|  | //    } | ||||||
|  | //    func (m MyController) Ping() { | ||||||
|  | //	     m.Ctx.Output.Body([]byte("hello world")) | ||||||
|  | //    } | ||||||
|  | // | ||||||
|  | //    RouterGet("/api/:id", MyController.Ping) | ||||||
|  | func (p *ControllerRegister) RouterGet(pattern string, f interface{}) { | ||||||
|  | 	p.AddRouterMethod(http.MethodGet, pattern, f) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // AddRouterMethod add http method router | ||||||
|  | // usage: | ||||||
|  | //    type MyController struct { | ||||||
|  | //	     web.Controller | ||||||
|  | //    } | ||||||
|  | //    func (m MyController) Ping() { | ||||||
|  | //	     m.Ctx.Output.Body([]byte("hello world")) | ||||||
|  | //    } | ||||||
|  | // | ||||||
|  | //    AddRouterMethod("get","/api/:id", MyController.Ping) | ||||||
|  | func (p *ControllerRegister) AddRouterMethod(method, pattern string, f interface{}) { | ||||||
|  | 	method = strings.ToUpper(method) | ||||||
|  | 	if method != "*" && !HTTPMETHOD[method] { | ||||||
|  | 		panic("not support http method: " + method) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	ct, methodName := getReflectTypeAndMethod(f) | ||||||
|  | 	route := &ControllerInfo{} | ||||||
|  | 	route.pattern = pattern | ||||||
|  | 	route.routerType = routerTypeBeego | ||||||
|  | 	route.sessionOn = p.cfg.WebConfig.Session.SessionOn | ||||||
|  | 	route.controllerType = ct | ||||||
|  | 	route.methods = map[string]string{method: methodName} | ||||||
|  | 	p.addToRouter(method, pattern, route) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // get reflect controller type and method by controller method expression | ||||||
|  | func getReflectTypeAndMethod(f interface{}) (controllerType reflect.Type, method string) { | ||||||
|  | 	// check f is a function | ||||||
|  | 	funcType := reflect.TypeOf(f) | ||||||
|  | 	if funcType.Kind() != reflect.Func { | ||||||
|  | 		panic("not a method") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// get function name | ||||||
|  | 	funcObj := runtime.FuncForPC(reflect.ValueOf(f).Pointer()) | ||||||
|  | 	if funcObj == nil { | ||||||
|  | 		panic("cannot find the method") | ||||||
|  | 	} | ||||||
|  | 	funcNameSli := strings.Split(funcObj.Name(), ".") | ||||||
|  | 	lFuncSli := len(funcNameSli) | ||||||
|  | 	if lFuncSli == 0 { | ||||||
|  | 		panic("invalid method full name: " + funcObj.Name()) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	method = funcNameSli[lFuncSli-1] | ||||||
|  | 	if len(method) == 0 { | ||||||
|  | 		panic("method name is empty") | ||||||
|  | 	} else if method[0] > 96 || method[0] < 65 { | ||||||
|  | 		panic("not a public method") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// check only one param which is the method receiver | ||||||
|  | 	if numIn := funcType.NumIn(); numIn != 1 { | ||||||
|  | 		panic("invalid number of param in") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// check the receiver implement ControllerInterface | ||||||
|  | 	controllerType = funcType.In(0) | ||||||
|  | 	_, ok := reflect.New(controllerType).Interface().(ControllerInterface) | ||||||
|  | 	if !ok { | ||||||
|  | 		panic(controllerType.String() + " is not implemented ControllerInterface") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// check controller has the method | ||||||
|  | 	_, exists := controllerType.MethodByName(method) | ||||||
|  | 	if !exists { | ||||||
|  | 		panic(controllerType.String() + " has no method " + method) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Get add get method | // Get add get method | ||||||
| // usage: | // usage: | ||||||
| //    Get("/", func(ctx *context.Context){ | //    Get("/", func(ctx *context.Context){ | ||||||
|  | |||||||
| @ -461,6 +461,26 @@ func (app *HttpServer) AutoPrefix(prefix string, c ControllerInterface) *HttpSer | |||||||
| 	return app | 	return app | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // RouterGet see HttpServer.RouterGet | ||||||
|  | func RouterGet(rootpath string, f interface{}) { | ||||||
|  | 	BeeApp.RouterGet(rootpath, f) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // RouterGet used to register router for RouterGet method | ||||||
|  | // usage: | ||||||
|  | //    type MyController struct { | ||||||
|  | //	     web.Controller | ||||||
|  | //    } | ||||||
|  | //    func (m MyController) Ping() { | ||||||
|  | //	     m.Ctx.Output.Body([]byte("hello world")) | ||||||
|  | //    } | ||||||
|  | // | ||||||
|  | //    RouterGet("/api/:id", MyController.Ping) | ||||||
|  | func (app *HttpServer) RouterGet(rootpath string, f interface{}) *HttpServer { | ||||||
|  | 	app.Handlers.RouterGet(rootpath, f) | ||||||
|  | 	return app | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Get see HttpServer.Get | // Get see HttpServer.Get | ||||||
| func Get(rootpath string, f FilterFunc) *HttpServer { | func Get(rootpath string, f FilterFunc) *HttpServer { | ||||||
| 	return BeeApp.Get(rootpath, f) | 	return BeeApp.Get(rootpath, f) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user