回答

收藏

http.HandleFunc 模式中的通配符

技术问答 技术问答 268 人阅读 | 0 人回复 | 2023-09-12

在 Go(语言)注册处理程序时,有没有办法在模式中指定通配符?
  w" f; U7 d' i% a( L6 X8 z! y6 V例如:, [( f* |2 k5 Q+ J& ]9 K4 G
    http.HandleFunc("/groups/*/people",peopleInGroupHandler)
    + ^4 H2 ]8 L! g8 x* c; p  b
其中*任何有效的 URL 字符串。groups ( peopleInGroupHandler) func 匹配和找出其余部分的唯一解决方案?- m4 V! N' E5 V
                                                               
; P( M7 P$ B' M* i& u% o" N    解决方案:                                                                * f6 e: h" q2 p
                                                                http.Handler 和 http.HandleFunc 的模式不是正则的表达式或 glob。没有办法指定通配符。它们记录在这里。2 s* N5 U+ ?& V/ S# p" k9 r6 P7 A
也就是说,创建自己的处理程序可以使用正则表达式或任何其他类型的模式并不难。这是一种使用正则表达式(已编译但未经测试):2 |; Q$ t* j7 V) B
    type route struct    pattern *regexp.Regexp    handler http.Handler}type RegexpHandler struct    routes []*route}func (h *RegexpHandler) Handler(pattern *regexp.Regexp,handler http.Handler)    h.routes = append(h.routes,&route{pattern,handler})}func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp,handler func(http.ResponseWriter,*http.Request))    h.routes = append(h.routes,&route{pattern,http.HandlerFunc(handler)})}func (h *RegexpHandler) ServeHTTP(w http.ResponseWriter,r *http.Request)    for _,route := range h.routes        if route.pattern.MatchString(r.URL.Path)            route.handler.ServeHTTP(w,r)            return        no pattern matched; send 404 response    http.NotFound(w,r)}  i# B2 H8 h- \! n" m+ ]; C" ~7 M
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则