在Go中搭建简单实现HTTP服务中间件

zijizhidao · · 526 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

一个简单http服务框架,就是注册一堆路由,然后根据路由调用不同的逻辑去处理。 那么这个时候搞一个中间做预处理,是一个不错的想法。 定义一个中间件单元: ``` 1 package main 2 3 import ( 4 "net/http" 5 ) 6 7 // AdaptorHandle middleware func type 8 type AdaptorHandle func(w http.ResponseWriter, r *http.Request) (next bool, err error) 9 10 // MiddleWareAdaptor router middlewares mapped by url 11 type MiddleWareAdaptor struct { 12 URLs map[string][]AdaptorHandle 13 } 14 15 // MakeMiddleWareAdaptor make a middleware adaptor 16 func MakeMiddleWareAdaptor() *MiddleWareAdaptor { 17 mwa := &MiddleWareAdaptor{ 18 URLs: make(map[string][]AdaptorHandle), 19 } 20 21 return mwa 22 } 23 24 // Regist regist a adaptor 25 func (mw *MiddleWareAdaptor) Regist(url string, Adaptor ...AdaptorHandle) { 26 for _, adp := range Adaptor { 27 mw.URLs[url] = append(mw.URLs[url], adp) 28 // mw.URLs[url] = adp 29 } 30 } 31 32 // Exec exec middleware adaptor funcs... 33 func (mw *MiddleWareAdaptor) Exec(url string, w http.ResponseWriter, r *http.Request) (bool, error) { 34 if adps, ok := mw.URLs[url]; ok { 35 for _, adp := range adps { 36 if next, err := adp(w, r); !next || (err != nil) { 37 return next, err 38 } 39 } 40 } 41 return true, nil 42 } ``` 然后将路由处理函数用中间件入口包裹起来: ``` 1 func middlewareHandler(next http.Handler) http.Handler { 2 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 3 // before call handler 4 start := time.Now() 5 do, _ := mwa.Exec(r.URL.Path, w, r) // exec middleware 6 // call next handler 7 if do { 8 log.Println("middleware done. next...") 9 next.ServeHTTP(w, r) 10 } else { 11 log.Println("middleware done.break...") 12 } 13 // after call handle 14 log.Printf("Comleted %s in %v", r.URL.Path, time.Since(start)) 15 }) 16 } 17 18 mux.Handle("/", middlewareHandler(&uPlusRouterHandler{})) 19 20 type uPlusRouterHandler struct { 21 } 22 23 func (rh *uPlusRouterHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 24 ... 25 } ````

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

526 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传