go使用net/http 创建web服务器

一、介绍

go作为一个对web开发友好的语言,内置了net/http库。来帮助我们实现web服务器。
我们来看官方文档给我的最简单的一个文件服务器的实现。

func main() {
    // Simple static webserver:
    handler := http.FileServer(http.Dir("/usr/share/doc"))
    _ = http.ListenAndServe(":8080", handler)
}

发现创建一个服务器主要有两步:

  1. 创建路由
  2. 启用服务器,并监听一个web端口

在启用服务器,并监听端口,我们一般用http.ListenAndServe这个方法。
在源码

// ListenAndServe always returns a non-nil error.
func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

我们可以看到ListenAndServe主要传两个参数,端口号,以及handle路由。
创建路由的话,我们主要有使用默认的DefaultServeMux,或者自己创建ServeMux。

二、使用DefaultServeMux创建路由的三种方式。

我们看一下Handler接口的定义

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

只要实现了 Handler 接口,就是一个有效的路由注册。
在官方默认的DefaultServeMux我们主要实现了三种方式,来看第一种。

2.1 通过结构图创建路由

比如我们开始使用的,用来创建一个 静态文件web服务器的方法。

func main() {
    // Simple static webserver:
    handler := http.FileServer(http.Dir("/usr/share/doc"))
    _ = http.ListenAndServe(":8080", handler)
}

主要是定义一个结构体,来实现Handler接口,如 http.FileServer()
就是用来创建了一个结构体fileHandler,而这个fileHandler拥有ServeHTTP(w ResponseWriter, r *Request)方法。
源码如下:net/http/fs.go

func FileServer(root FileSystem) Handler {
    return &fileHandler{root}
}

func (f *fileHandler) ServeHTTP(w ResponseWriter, r *Request) {
    upath := r.URL.Path
    if !strings.HasPrefix(upath, "/") {
        upath = "/" + upath
        r.URL.Path = upath
    }
    serveFile(w, r, f.root, path.Clean(upath), true)
}

你可能感兴趣的:(gohttp)