这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
创建 Web Server
- http.Server 这是一个struct
- Addr 字段表示网络地址
- 如果为"",那么就是所有网络接口的 80 端口
- Handler 字段
- 如果为 nil,那么就是DefaultServeMux
- ListenAndServe() 函数
- Addr 字段表示网络地址
package main
import "net/http"
func main() {
server := http.Server{
Addr: "127.0.0.1:8080",
Handler: nil,
}
server.ListenAndServe()
}
- handler 是一个接口(interface)
- handler 定义了一个方法 ServeHTTP()
- HTTPResponseWriter
- 指向 Request 这个 struct 的指针
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
多个 Handler - http.Handle
- 不指定 Server struct 里面的 Handler 字段值
- 可以使用 http.Handle 将某个Handler 附加到DefaultServeMux
- http 包有一个 Handle 函数
- ServerMux struct 也有一个 Handle 方法
- 如果调用 http.Handle,实际上调用的是 DefaultServeMux 上的Handle方法
- DefaultServrMux 就是 ServerMux 的指针变量
- Handler 函数就是那些行为与 handler 类似的函数
- Handler 函数的签名与 ServeHTTP 方法的签名一样,接收:
- 一个 http.ResponseWriter
- 一个指向 http.Request 的指针
http.Handle 第二个参数是 Handler http.HandleFunc 第二个参数是一个Handler 函数
Go 内置的 Handler
- NotFoundHandler
- func NotFoundHandler() Handler
- 返回一个 handler,它给每个请求的响应都是 "404 page not found"
- RedirectHandler
- func RedirectHandler(url string, code int) Handler
- 返回一个 handler,它把每个请求使用给定的状态码跳转到指定的URL.
- url,要跳转到的URL
- code, 跳转的状态码(3xx),常见的:
- StatusMovedPermanently
- SttatusFound 或 StatusSeeOther 等
- StripPrefix
- func StripPrefix(prefix string, h handler) Handler
- 返回一个 handler,它从请求 URL 中去掉指定的前缀,然后再调用另一个 handler.
- 如果请求的 URL 与提供的前缀不符,那么404
- 略像中间件
- prefix, URL 将要被移除的字符串前缀
- h,是一个 handler,在移除字符串前缀之后,这个 handler 将会接收到请求.
- TimeoutHandler
- func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
- 返回一个handler,它用来指定时间内运行传入的 h
- 也相当于是一个修饰器
- h,将要被修饰的 handler
- dt,第一个 handler 允许的处理时间
- msg,如果超时,那么就把 msg 返回给请求,表示响应时间过长
- FileServer
- func FileServer(root FileSystem) Handler
- 返回一个 handler,使用基于 root 的文件系统来响应请求
- type FileSystem interface { Open(name string)(File, erroe)}
- 使用时需要用到操作系统的文件系统,所以还需要委托给:
- type Dir string
- func (d Dir) Open(name string) (File, error)