1.12 Go HTTP服务器进阶:路由、中间件、错误处理完整实现
引言
构建生产级的HTTP服务器需要路由管理、中间件机制和统一的错误处理。本文将深入讲解这些进阶功能,帮助你构建健壮的HTTP服务器。
一、路由管理
1.1 自定义路由器
packagemainimport("fmt""net/http")typeRouterstruct{routesmap[string]http.HandlerFunc}funcNewRouter()*Router{return&Router{routes:make(map[string]http.HandlerFunc),}}func(r*Router)HandleFunc(patternstring,handler http.HandlerFunc){r.routes[pattern]=handler}func(r*Router)ServeHTTP(w http.ResponseWriter,req*http.Request){handler,ok:=r.routes[req.URL.Path]if!ok{http.NotFound(w,req)return}handler(w,req)}funcmain(){router:=NewRouter()router.HandleFunc("/",func(w http.ResponseWriter,r*http.Request){fmt.Fprintf(w,"首页")})router.HandleFunc("/about",func(w http.ResponseWriter,r*http.Request){fmt.Fprintf(w,"关于")})http.ListenAndServe(":8080",router)}1.2 使用Gorilla Mux
packagemainimport("fmt""net/http""github.com/gorilla/mux")funcmain(){r:=mux.NewRouter()// 精确匹配r.HandleFunc("/users",listUsers).Methods("GET")r.HandleFunc("/users",createUser).Methods("POST")// 路径参数r.HandleFunc("/users/{id:[0-9]+}",getUser).Methods("GET")r.HandleFunc("/users/{id:[0-9]+}",updateUser).Methods("PUT")r.HandleFunc("/users/{id:[0-9]+}",deleteUser).Methods("DELETE")// 子路由api:=r.PathPrefix("/api/v1").Subrouter()api.HandleFunc("/users",apiListUsers).Methods("GET")http.ListenAndServe(":8080",r)}二、中间件机制
2.1 中间件基础
packagemainimport("fmt""log""net/http""time")typeMiddlewarefunc(http.HandlerFunc)http.HandlerFuncfuncLoggingMiddleware(next http.HandlerFunc)http.HandlerFunc{returnfunc(w http.ResponseWriter,r*http.Request){start:=time.Now()log.Printf("开始 %s %s",r.Method,r.URL.Path)next(w,r)log.Printf("完成 %s %s (耗时: %v)",r.Method,r.URL.Path,time.Since(start))}}funcAuthMiddleware(next http.HandlerFunc)http.HandlerFunc{returnfunc(w http.ResponseWriter,r*http.Request){token:=r.Header.Get("Authorization")iftoken==""