我需要一个可以支持静态和动态路由的HTTP router "violetear",我的意思是,可以处理请求,例如:
/read/book/:uuid/:uuid/
:uuid类似于C6FF0F6F-A274-48F4-B219-6595DCB989A5
或基本路线如:
/read/page/3
对于中间件,我使用Alice帮助我保持与http.Handler接口的兼容性 .
到目前为止一直很好,直到我需要在中间件之间交换数据或访问命名参数,如前面示例中的 :uuid
.
由于路由器用于其他项目,我想继续保持与http.Handler接口的兼容性,因此我决定不将 net/context
作为参数传递给中间件并选择包含在http.ResponseWriter中,如下所示:https://github.com/nbari/violetear/blob/master/response_writer.go#L14 .
基本上这种方法如果我需要使用上下文我必须做的事情:
func handleUUID(w http.ResponseWriter, r *http.Request) {
cw := w.(*ResponseWriter)
// add a key-value pair to the context
cw.Set("key", "my-value")
// print current value for :uuid
fmt.Fprintf(w, "Named parameter:, %q", cw.Get(":uuid"))
}
请注意 cw := w.(*ResponseWriter)
.
这是有效的,但想知道是否通过执行 type
开关存在任何问题,或者是否有任何问题这样做 .
提前致谢 .