花了一个星期学习文件服务器,老是在一些地方搞混,整理一下所学的,清晰了不少。
学Go半个月,还有很多不懂的地方,有理解错误的,还望高手指出。
注:以下代码中,w为http.ResponseWriter类型, r为*http.Request类型
1、先该清楚一些类型的意义:
Handler:处理请求和生成返回的接口。其实就是接口。
ServerMux:路由,也是一种Handler。还是接口。
Request:用户的请求信息,用来解析用户的请求信息包括,POST、GET、Cookie、URL等信息。
Response:服务器需要反馈给用户端的信息。
ResponseWriter:生成Response的接口。也还是接口
Conn:网络连接。
ServerMux有map表,map的key是r.URL.String(),而Value记录的是一个方法,这个方法与ServeHTTP是一样的,也叫HandlerFunc。另一个方法是Handle 用来注册HandlerFunc。
ServeMUx实现Handler接口,充当http.ListenAndServe()的第二个参数。
http.ListenAndServe()的第二个参数是Handle接口,实现配置外部路由器(也就是非默认的路由器)。
2、设置路由的方法:
(1)
func fooHandler(w,r){ }
http.Handle("/foo", fooHandler)//此处是http.Handle,而不是http.Handler
(2)
http.HandleFunc("/foo", func(w,r){
//处理
})
以上配置的是默认路由
如果自己使用了ServeMux作为路由,就得用其他配置方法了
(3)配置ServeMux路由
1)
mux:=http.NewServeMux()
mux.Handle("/foo",&fooHandler{})//第二个参数是一个Handler,可以是定义一个Handler接口,也可以是返回Handler的函数。比如:StripPrefix(prefix string, h Handler) Handler {}等。
type fooHandler struct{}
func (*fooHandler)serveHTTP(w,r){
//处理
}
2)
mux:=http.NewServeMux()
mux.HandleFunc("/foo", fooHandler)
func fooHandler(w,r){
//处理
}
3)
Var mux map[string] func(w,r)
mux=make[string]func(w,r)
mux["/foo"]=fooHandler
func fooHandler(w,r){
}
再定义一个Handler作为默认的handler,实现路由
type myHandler struct{}
func (*myHandler)ServeHTTP(w,r){
if h,ok:=mux[r.URL.String()];ok{ //注意mux[]的匹配。需要的时候,要用path包,比如我就用到了mux[path.Dir(r.URL.path)]。
h(w,r)
return
}
}
server自己定义:
server:=http.Server{
Addr: ":9090",
Handler: &myhandler{}, //myhandler在这里使用
ReadTimeout: 5 * time.Second,
}
3、简单文件服务器实现的三种方法
(1)
(2)
(3)