net / context包装在http.ResponseWriter上,好还是坏?

时间:2016-01-27 18:34:14

标签: http go

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

提前致谢。

0 个答案:

没有答案