ServeMux详解

创建一个http服务

在 Go 语言中,创建一个 HTTP 服务只需要写下面几行代码就可以了。

func main() {
    http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello web"))
    })
    http.ListenAndServe(":9999", nil)
}

我们定义了一个路由,然后启动 HTTP 服务,就可以在浏览器中通过 localhost:9999 来访问服务,服务端会返回 Hello web。这样就创建了一个http服务。

HTTP 服务如何运行

上面的代码有两部分,一部分是定义 HTTP 服务的路由,在服务启动之后,我们访问相应的路由,就能得到服务端的响应。
在 http 包中,有一个接口 http.Handler ,这个接口是 HTTP 服务的核心:

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

一个 完整的HTTP 服务,需要有发起请求的客服端和处理请求的服务端,客户端发起一个请求,然后服务端给出对应的输出。这个 Handler 接口就把这个整个过程抽象为 ServeHTTP 方法。ResponseWriter 表示服务端的输出,Request 表示来自客户端的请求。
在 http 包中提供了一个 Handler 的实现 ServeMux,这个Handler 做的事情也很简单,就是来维护 URL 和 Handler 之间的关系,根据 URL 判断应该把请求转发到哪个 Handler。

ServeMux

http.ServeMux 是 Go 标准库 net/http 中的 HTTP 请求路由器(路由复用器),负责将传入的 HTTP 请求匹配到对应的处理函数(Handler)。它是 Go 中最基础的路由实现,常用于构建简单的 Web 服务。

核心功能

  • 路由匹配:根据 URL 路径(r.URL.Path)将请求分发给注册的 Handler。路由由两部分组成,一个是匹配 HTTP url 的 pattern,每个pattern 都代表着一类 HTTP 请求,都需要一个对应的 handler 来处理。
  • 路径标准化:自动处理路径末尾的 / 和重复斜杠(如 /api//v1/api/v1)。
  • 通配路由:支持简单的通配模式(如 /images/ 匹配 /images/xxx)。
  • 并发安全:支持多 Goroutine 并发注册和调用路由。

    基本用法

    创建ServeMux

    mux := http.NewServeMux() // 创建空路由
    // 或直接使用默认的全局路由:
    // http.HandleFunc("/", handler) 会注册到 http.DefaultServeMux

    注册路由

    静态路径:

    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Home Page"))
    })

    统配路径:

    mux.HandleFunc("/images/", func(w http.ResponseWriter, r *http.Request) {
    // 匹配 /images/xxx, /images/yyy/zzz 等
    fmt.Fprintf(w, "Requested image: %s", r.URL.Path)
    })

    自定义Hander:

    type MyHandler struct{}
    func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Custom Handler"))
    }
    mux.Handle("/custom", &MyHandler{}) // 注册自定义 Handler

    启动服务

    http.ListenAndServe(":8080", mux) // 使用自定义 mux
    // 或使用默认路由:
    // http.ListenAndServe(":8080", nil) // 默认使用 http.DefaultServeMux
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!