Golang搭建HTTP服务

来源:互联网 发布:网络直播平台分红 编辑:程序博客网 时间:2024/05/29 13:13

http://www.jianshu.com/p/be3d9cdc680b
人世间-小哥力作,思路清晰,讲的较全面。

简单概括:
构建HTTP服务分为两步
1.注册路由
2.实例化server并监听客户端请求

1.注册路由

注册路由可以使用DafaultServeMux,同样可以创建一个新的ServerMux。

(1) 使用DefaultServeMUX

这种方式直接调用Http.HandleFunc(pattern,handler)即可,因为HandleFunc内部通过DafaultServeMux调用serverMux的HandleFunc进行了路由注册。

(2) 使用自定义的ServeMUX

首先需要使用http.NewServeMux()创建一个ServeMux,然后利用该ServeMux进行路由注册。-1) mux.HandleFunc()//将一个handle函数转变为handle转变为handle处理器-2) mux.handle()//将一个handle对象转变为一个handle处理器

在(1) (2)中其实都用到了mux的HandleFunc方法,只是一个是DafaultServeMux,另一个是自定义的ServeMux。

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {    mux.Handle(pattern, HandlerFunc(handler))}

在HandleFunc函数内部的HandlerFunc是一个函数类型,同时他实现了Handle接口,所以调用mux.HandleFunc会将一个Handle函数变成一个Handle处理器。

2.监听处理

当有请求来临时,DafaultServeMux或者自定义的mux会在其内部的路由表内找到对应的路由处理器并进行生成相响应和回复功能。

如果路由较多,可以通过使用一个中间件进行一些相关内容的处理,比如错误接收,时间的打印等等。这样可以有效的减少代码的冗余。

func safeHandler(fn http.HandlerFunc) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        defer func() {            if e, ok := recover().(error); ok {                http.Error(w, e.Error(), http.StatusInternalServerError)                fmt.Println("err")            }        }()        fn(w, r)    }}