如有错误欢迎纠正, 有缺漏欢迎补充
参考资料:
https://github.com/urfave/negroni/blob/master/translations/README_zh_CN.md
https://github.com/gorilla/mux
https://github.com/unrolled/render
https://github.com/pmlpml/golang-learning/tree/master/web
假设我们开发服务端时用如下代码:
package main
import (
"service"
)
func main() {
server := service.NewServer()
server.Run(":8080")
}
package service
import (
"net/http"
"github.com/codegangsta/negroni"
"github.com/gorilla/mux"
"github.com/unrolled/render"
)
// NewServer configures and returns a Server.
func NewServer() *negroni.Negroni {
// 返回一个Render实例的指针
formatter := render.New(render.Options{
IndentJSON: true, // 输出时的格式是方便阅读的JSON
})
n := negroni.Classic()
mx := mux.NewRouter()
initRoutes(mx, formatter)
n.UseHandler(mx)
return n
}
func initRoutes(mx *mux.Router, formatter *render.Render) {
// 如果用户访问了地址 /hello/{id}, 那就对应调用该函数
// 此处的函数为 testHandler 函数返回的 http.HandlerFunc
mx.HandleFunc("/hello/{id}", testHandler(formatter)).Methods("GET")
}
func testHandler(formatter *render.Render) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
id := vars["id"]
formatter.JSON(w, http.StatusOK, struct{ Test string }{
"Hello " + id})
}
}
negroni和gorilla/mux工作的流程图如下:
server := service.NewServer()
// Classic 返回带有默认中间件的Negroni实例指针:
n := negroni.Classic()
// New 创建 negroni 实例并返回其指针
return New(NewRecovery(),
NewLogger(),
NewStatic(http.Dir("public"))
)
return &Negron