我需要一个支持静态和动态路由的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
转换是否存在任何问题,或者是否有任何疑虑。
提前致谢。