1. 创建http web server的两个方法
1.1. 方式一:http.ListenAndServe(addr string, handler Handler)
- addr string:监听地址,如果为"" ,那么就是所有网络接口的80接口
- handler Handler:如果为nil,那么就是DefaultServeMux,DefaultServeMux是一个multiplexer(可以看作是路由器)
package main
import (
"net/http"
)
func main() {
// 使用http.ListenAndServe 就可以创建一个web服务,但是这个时候启动访问是404,因为 handle=nil
http.ListenAndServe("localhost:8080", nil)
}
1.2. 方式2:使用http.Serve{}
http.Server是一个struct有两个常用参数(Addr 、Handler) 和一个函数ListenAndServe
- addr string:监听地址,如果为"" ,那么就是所有网络接口的80接口
- handler Handler:如果为nil,那么就是DefaultServeMux,DefaultServeMux是一个multiplexer(可以看作是路由器)
- ListenAndServe()函数
package main
import "net/http"
func main() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
server.ListenAndServe()
}
2. Handler
- handler处理http请求的的核心接口
- handle 定义了一个方法ServerHTTP()
-
- ResponseWriter 处理请求响应
- Request接收请求
2.1. 向web server 添加Handler
2.1.1. 方法一:http.Handle(pattern string, handler Handler)
- pattern string: 路由,访问路径
- handler Handler:Handler
package main
import "net/http"
// 1. 创建结构体
type helloHandler struct{}
type aboutHandler struct{}
// 2. 创建结构体的方法,实现ServeHTTP方法,并在方法中书写代码逻辑
func (m *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
}
func (m *aboutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("About!"))
}
func main() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
//3.创建结构提的实例
hello := helloHandler{}
about := aboutHandler{}
//4. 使用http.Handle 注册handler
//http.Handle 有两个参数,第一个是请求路径,第二个是Handle的指针变量
http.Handle("/hello", &hello)
http.Handle("/about", &about)
server.ListenAndServe()
}
2.1.2. 方法二:http.HandleFunc(pattern string, handler func(ResponseWriter, *Request))
- pattern string: 路由,访问路径
- handler func(ResponseWriter, *Request):和handler结构相同的函数,HandleFunc内部会将传入的函数转换为handler并调用http.Handle(pattern string, handler Handler)方法实现注册
package main
import "net/http"
// 1. 创建执行逻辑的函数
func welcome(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("welcome"))
}
func main() {
server := http.Server{
Addr: "localhost:8080",
Handler: nil,
}
//2.使用 http.HandleFunc 注册handler
http.HandleFunc("/welcome", welcome)
//http.HandlerFunc(函数) 会把传入的函数转换为handler 所以http.HandleFunc("/welcome", welcome) 等同于 http.Handle("/welcome", http.HandlerFunc(welcome))
//http.Handle("/welcome", http.HandlerFunc(welcome))
//或者使用匿名函数
http.HandleFunc("/home", func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("home"))
})
server.ListenAndServe()
}
2.2. 内置handler
1. http.NotFoundHandler()
func NotFoundHandler() Handler
返回一个handler,给每个请求的响应都是404 page not found
2.http.RedirectHandler()
func RedirectHandler(url string, code int) Handler
返回一个handler,使用给定的状态吗把每个请求跳转到指定的url
url:要跳转的url
code:状态吗
3.http.StripPrefix()
func StripPrefix(prefix string, h Handler) Handler
返回一个handler,从请求的url中去掉指定的前缀,然后再调用另一个handler
如果请求的url与提供的前缀不符,返回404
prefix:需要移除的字符
h:需要被调用的handler
4. http.TimeoutHandler()
func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler
返回一个handler,用来在指定时间内运行传入的handler
h:需要被修饰的handler,
dt:handler允许处理的时间
msg:如果超时就把msg返回给请求
5. http.FileServer()
func FileServer(root FileSystem) Handler
返回一个handler,基于root的文件系统来响应请求
root:访问的根目录,使用 http.Dri将根目录转换为FileSystem