golang简单静态服务器打印在终端上

时间:2017-08-27 22:04:44

标签: go

这是我最初的golang代码:

package main
import (
    "net/http"
    "io"
)

const hello = `hello world`


func helloHandler(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, hello)
}


func main() {
    http.HandleFunc("/", helloHandler)
    http.ListenAndServe(":1088", nil)
}

它是一个简单的http服务器,我需要添加新功能,每个get请求都在linux终端ip,METHOD,/ request打印。

终端需要的示例输出:

95.250.33.36 GET /
95.250.33.36 GET /favicon.ico
95.250.33.36 GET /robots.txt

我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

关于Golang的最好的事情是接口。 您的helloHandler实际上实现了HandlerFunc接口。 使用Open/Close Principle我们可以使用helloHandler并对其进行扩展,以便按以下方式记录请求:

func wrapHandlerWithLogging(wrappedHandler http.Handler) http.HandlerFunc {
    return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
       log.Printf("--> %s %s", req.Method, req.URL.Path)
       wrappedHandler.ServeHTTP(w, req)
    })
}

func main() {
    ...
    http.HandleFunc("/", wrapHandlerWithLogging(http.HandlerFunc(helloHandler)))
    ...
 }

所以基本上,我们用helloHandler包裹HandlerFunc和另一个HandlerFunc

在这个例子中,我们只记录请求方法(GET,POST,PUT等)和请求路径(例如'/')。但是,您可以记录其他数据:

    发送请求的
  • req.RemoteAddr网络地址
  • req.Proto协议版
  • req.Host指定寻求网址的主机