Golang中间件只有标准库

时间:2017-05-22 10:42:09

标签: go

我的第一个stackoverflow问题,所以请放心我对于stackoverflow的天真和问题,初学者在golang。

我想知道这两个电话之间的区别以及对HandleHandlerHandleFuncHandlerFunc的简单理解。

  

http.Handle(“/ profile”,Logger(profilefunc))
  http.HandleFunc(“/”,HomeFunc)

func main() {            
   fmt.Println("Starting the server.")

   profilefunc := http.HandlerFunc(ProfileFunc)

   http.Handle("/profile", Logger(profilefunc))
   http.HandleFunc("/", HomeFunc)

   http.ListenAndServe("0.0.0.0:8081", nil)
}

func Logger(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
        log.Println("Before serving request")
        h.ServeHTTP(w, r)
        log.Println("After serving request")
    })
}

func ProfileFunc(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "You are on the profile page.")
}

func HomeFunc(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello Imran Pochi")
}

2 个答案:

答案 0 :(得分:2)

根据我在Go文档示例中看到的内容:

  • 处理程序是为响应HTTP请求而创建的类型。要使类型成为Handler,所有人必须要实现的是ServeHTTP()方法。 ServeHTTP()方法执行实际的请求处理。

  • Handle()获取路由和Handler,该类型具有名为ServeHttp()的实例方法。请注意,它只需要类型,不需要指向明确处理请求的实际方法/函数。

  • HandlerFunc是一种内部实现ServeHTTP()方法的类型。 HandlerFunc用于将具有正确签名的任何Go函数强制转换为HandlerFunc。然后,新创建的HandlerFunc与其处理的路由一起传递给Handle()方法。 请注意,HandlerFunc只需编写函数即可实现请求处理程序,而无需专用的处理程序类型。

  • HandleFunc()采用路线和任何具有正确签名的功能。 HandleFunc是首先进行类型转换然后将函数传递给Handle()方法的简写。

请求处理函数的签名是:

  func handlerName(wr http.ResponseWriter, req *http.Request)

答案 1 :(得分:1)

  

我想...简单理解Handle,Handler,HandleFunc,HandlerFunc。

  • Lambda function是一个可以响应HTTP请求并具有Handler方法的接口。
  • ServeHTTP(ResponseWriter, *Request)注册http.Handle来处理与给定Handler匹配的HTTP请求。
  • pattern注册一个处理函数来处理与给定http.HandleFunc匹配的HTTP请求。处理函数的格式应为pattern
  • func(ResponseWriter, *Request)HandlerFunc形式的显式函数类型。 func(ResponseWriter, *Request)有一个调用自身的方法HandlerFunc。这允许您将函数转换为ServeHTTP并将其用作HandlerFunc
  

我想知道两个电话之间的区别

Handler

http.Handle("/profile", Logger(profilefunc)) http.HandleFunc("/", HomeFunc) middleware的一个示例,它是一个带Logger的函数,它返回包装原始处理程序的另一个http.Handler。调用此处理程序时,可能(或可能不)在执行某些操作之前和/或之后调用嵌套的http.Handler。因此,第一行是说使用模式“/ profile”注册包含在http.Handler中间件中的profileFunc Handler。第二行是使用“/”模式注册Logger函数。