mirror of
https://gitee.com/johng/gf
synced 2026-06-07 10:22:11 +08:00
完成ghttp.Server动态路由规则特性,修复带HTTPMethod的服务注册规则问题
This commit is contained in:
3
TODO
3
TODO
@ -1,3 +1,4 @@
|
||||
1. gconv完善针对不同类型的判断,例如:尽量减少sprintf("%v", xxx)来执行string类型的转换;
|
||||
2. gdb Where方法参数的改进,研究是否可以将string参数类型修改为interfaceP{;
|
||||
3. 增加对于数据表Model的封装;
|
||||
3. 增加对于数据表Model的封装;
|
||||
4. ghttp.Server请求执行中增加服务退出的方法,不再执行后续操作;
|
||||
@ -20,10 +20,10 @@ func (s *Server)parsePatternForBindHandler(pattern string) (domain, method, uri
|
||||
domain = gDEFAULT_DOMAIN
|
||||
method = gDEFAULT_METHOD
|
||||
if array, err := gregx.MatchString(`([a-zA-Z]+):(.+)`, pattern); len(array) > 1 && err == nil {
|
||||
method = array[1]
|
||||
pattern = array[2]
|
||||
method = array[1]
|
||||
uri = array[2]
|
||||
}
|
||||
if array, err := gregx.MatchString(`(.+)@([\w\.\-]+)`, pattern); len(array) > 1 && err == nil {
|
||||
if array, err := gregx.MatchString(`(.+)@([\w\.\-]+)`, uri); len(array) > 1 && err == nil {
|
||||
uri = array[1]
|
||||
domain = array[2]
|
||||
}
|
||||
@ -47,10 +47,10 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error {
|
||||
defer s.hmmu.Unlock()
|
||||
if method == gDEFAULT_METHOD {
|
||||
for v, _ := range s.methodsMap {
|
||||
s.handlerMap[s.handlerKey(domain, v, pattern)] = item
|
||||
s.handlerMap[s.handlerKey(domain, v, uri)] = item
|
||||
}
|
||||
} else {
|
||||
s.handlerMap[s.handlerKey(domain, method, pattern)] = item
|
||||
s.handlerMap[s.handlerKey(domain, method, uri)] = item
|
||||
}
|
||||
|
||||
// 动态注册,首先需要判断是否是动态注册,如果不是那么就没必要添加到动态注册记录变量中
|
||||
@ -121,19 +121,41 @@ func (s *Server) compareHandlerItemPriority(newItem, oldItem *HandlerItem) bool
|
||||
|
||||
// 服务方法检索
|
||||
func (s *Server) searchHandler(r *Request) *HandlerItem {
|
||||
f := s.searchHandlerStatic(r)
|
||||
if f == nil {
|
||||
f = s.searchHandlerDynamic(r)
|
||||
}
|
||||
// 如果检索不到服务,那么使用默认的"/"服务注册来执行服务
|
||||
// "/"静态路由是特殊的路由,当所有服务都找不到时,会交给"/"路由规则的控制器来处理
|
||||
if f == nil && r.URL.Path != "/" {
|
||||
path := r.URL.Path
|
||||
r.URL.Path = "/"
|
||||
f = s.searchHandlerStatic(r)
|
||||
r.URL.Path = path
|
||||
}
|
||||
return f
|
||||
}
|
||||
|
||||
// 检索静态路由规则
|
||||
func (s *Server) searchHandlerStatic(r *Request) *HandlerItem {
|
||||
s.hmmu.RLock()
|
||||
defer s.hmmu.RUnlock()
|
||||
domains := []string{gDEFAULT_DOMAIN, strings.Split(r.Host, ":")[0]}
|
||||
// 首先进行静态匹配
|
||||
for _, domain := range domains {
|
||||
if f, ok := s.handlerMap[s.handlerKey(domain, r.Method, r.URL.Path)]; ok {
|
||||
s.hmmu.RUnlock()
|
||||
return f
|
||||
}
|
||||
}
|
||||
s.hmmu.RUnlock()
|
||||
// 其次进行动态匹配
|
||||
array := strings.Split(r.URL.Path[1:], "/")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 检索动态路由规则
|
||||
func (s *Server) searchHandlerDynamic(r *Request) *HandlerItem {
|
||||
domains := []string{gDEFAULT_DOMAIN, strings.Split(r.Host, ":")[0]}
|
||||
array := strings.Split(r.URL.Path[1:], "/")
|
||||
s.htmu.RLock()
|
||||
defer s.htmu.RLock()
|
||||
for _, domain := range domains {
|
||||
p, ok := s.handlerTree[domain]
|
||||
if !ok {
|
||||
@ -182,14 +204,12 @@ func (s *Server) searchHandler(r *Request) *HandlerItem {
|
||||
}
|
||||
}
|
||||
}
|
||||
s.htmu.RUnlock()
|
||||
return item
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
s.htmu.RUnlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -235,7 +255,7 @@ func (s *Server) isUriHasRule(uri string) bool {
|
||||
}
|
||||
|
||||
// 生成回调方法查询的Key
|
||||
func (s *Server) handlerKey(domain, method, pattern string) string {
|
||||
return strings.ToUpper(method) + ":" + pattern + "@" + strings.ToLower(domain)
|
||||
func (s *Server) handlerKey(domain, method, uri string) string {
|
||||
return strings.ToUpper(method) + ":" + uri + "@" + strings.ToLower(domain)
|
||||
}
|
||||
|
||||
|
||||
@ -3,19 +3,23 @@ package main
|
||||
import "gitee.com/johng/gf/g/net/ghttp"
|
||||
|
||||
func main() {
|
||||
ghttp.GetServer().BindHandler("/:name/*any", func(r *ghttp.Request) {
|
||||
r.Response.WriteString("any")
|
||||
r.Response.WriteString(r.GetQueryString("name"))
|
||||
r.Response.WriteString(r.GetQueryString("any"))
|
||||
ghttp.GetServer().BindHandler("get:/h", func(r *ghttp.Request) {
|
||||
r.Response.WriteString("hello world")
|
||||
})
|
||||
//ghttp.GetServer().BindHandler("/:name/action", func(r *ghttp.Request) {
|
||||
|
||||
//ghttp.GetServer().BindHandler("/:name/*any", func(r *ghttp.Request) {
|
||||
// r.Response.WriteString("any")
|
||||
// r.Response.WriteString(r.GetQueryString("name"))
|
||||
// r.Response.WriteString(r.GetQueryString("any"))
|
||||
//})
|
||||
////ghttp.GetServer().BindHandler("/:name/action", func(r *ghttp.Request) {
|
||||
//// r.Response.WriteString(r.GetQueryString("name"))
|
||||
////})
|
||||
//ghttp.GetServer().BindHandler("/:name/:action/:aaa", func(r *ghttp.Request) {
|
||||
// r.Response.WriteString("name")
|
||||
// r.Response.WriteString(r.GetQueryString("name"))
|
||||
// r.Response.WriteString(r.GetQueryString("action"))
|
||||
//})
|
||||
ghttp.GetServer().BindHandler("/:name/:action/:aaa", func(r *ghttp.Request) {
|
||||
r.Response.WriteString("name")
|
||||
r.Response.WriteString(r.GetQueryString("name"))
|
||||
r.Response.WriteString(r.GetQueryString("action"))
|
||||
})
|
||||
ghttp.GetServer().SetPort(10000)
|
||||
ghttp.GetServer().Run()
|
||||
}
|
||||
Reference in New Issue
Block a user