Post

Go web Handle

Go web Handle

Web Server

创建web server

http

1
2
3
// func ListenAndServe(addr string, handler Handler) error
// handler == http.DefaultServeMux if nil
http.ListenAndServe("localhost:8080", nil)
1
2
3
4
5
6
7
// 配置server
server := http.Server{
    Addr: "localhost:8080",
    Handler: nil, // http.DefaultServeMux if nil
    // ... other
}
server.ListenAndServe()

https

  • go中的https使用的是http2
      http.ListenAndServeTSL()
      server.ListenAndServeTSL()
    

Handler

  • is an interface
    1
    2
    3
    
      type Handler interface {
          ServeHTTP(ResponseWriter, *Request)
      }
    

多Handler

http.Handle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type HelloHandle struct{}
// Handler interface
func (h *HelloHandle) ServeHTTP(w http.ResponseWriter, r *http.Request){
	w.Write([]byte("hello"))
}

mh := HelloHandle{}
server := http.Server{
    Addr:    "localhost:8080",
    Handler: nil,
}
// 注册mh到DefaultServeMux
http.Handle("/hello", &mh)
server.ListenAndServe()

http.HandleFunc

1
2
3
4
5
6
7
8
9
10
11
12
13
// 1.
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello"))
})
// 2.
func MyHandleFun(w http.ResponseWriter, r *http.Request){
    // do something
}
http.HandleFunc("/my", MyHandleFun)
// 3.
// type HandlerFunc func(ResponseWriter, *Request)
// 使用http.Handle和http.HandlerFunc(类型转换)等价于http.HandleFunc
http.Handle("/path", http.HandlerFunc(MyHandleFun))

内置Handler

  • http.NotFoundHandler
    • func NotFoundHandler() Handler
      • 404 page not found
  • http.RedirectHandler
    • func RedirectHandler(url string, code int) Handler
      • url: 要跳转到的URL; code: 3xx
  • http.StripPrefix
    • func StripPrefix(prefix string, h Handler) Handler
      • 前缀不匹配则返回404
      • 从请求URL中去掉prefix, 然后调用h这个Handler
  • http.TimeoutHandler
    • func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
      • 在dt时间内运行h这个Handler, 如果超时返回msg
  • http.FileServer
    • func FileServer(root FileSystem) Handler
      • 基于root这个文件系统来响应请求

FileSystem

  • 快捷实现一个静态文件服务器
    1
    2
    3
    4
    5
    6
    
      type FileSystem interface {
          Open(name string) (File, error)
      }
      // Dir就是一个文件系统
      type Dir string
      func (d Dir) Open(name string) (File, error)
    
This post is licensed under CC BY 4.0 by the author.