基于 HTTP 构建的网络应用包括两个端,即客户端 ( Client ) 和服务端 ( Server )。
两个端的交互行为包括从客户端发出 request、服务端接受request 进行处理并返回 response 以及客户端处理 response。所以 http 服务器的工作就在于如何接受来自客户端的 request,并向客户端返回 response,。
HTTP Server简单实现
对于 golang 来说,利用 net/http 包实现一个Http Server非常简单,只需要简简单单几句代码就可以实现,先看看 Golang 的其中一种 http server简单的实现:
例1:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello World!")
}
func main() {
//注册路由
http.HandleFunc("/", handler)
//创建服务且监听
http.ListenAndServe(":8080", nil)
再来看看另外一种http server实现,代码如下:
例2:
package main
import (
"fmt"
"net/http"
)
type routeIndex struct {
content string
}
func (route *routeIndex) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, route.content)
}
func main() {
//注册路由
http.Handle("/", &routeIndex{content: "Hello, World"})
//创建服务且监听
http.ListenAndServe(":8080", nil)
上述两种方法都实现了简单的 http server实现,写法虽然不同,但底层用到的原理其实都是一样的,我们通过源码进行解析。
在上述两种实现种,分别调用了 http.Handle 和 http.HandleFunc 来实现路由的处理,展开源码看看:
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
if handler == nil {
panic("http: nil handler")
}
mux.Handle(pattern, HandlerFunc(handler))
}
func (mux *ServeMux) Handle(pattern string, handler Handler) {
....
总结 http.Handle 和 http.HandleFunc 函数代码,可以得出以下几个重点内容: DefaultServeMux ,ServeMux, Handler 以及 ServeMux.Handle函数。