如何为HTTP代理注册额外的HTTP处理器(FooHandler)
问题解决:同时处理自定义HTTP处理器与代理请求
问题根源
你给http.Server指定了Handler: Router(mux路由实例)后,服务器会直接使用这个自定义路由处理所有请求,而之前通过http.HandleFunc("/", ProxyProcess)注册到默认ServeMux的代理路由会被忽略,这就是原代理请求失效的原因。
解决方案
把代理处理逻辑也注册到mux路由中,作为兜底路由(放在所有特定路由之后,确保优先匹配自定义的/api/v1/foo路径)。
具体修改步骤
修改
NewRouter函数,在遍历完自定义路由后,添加匹配所有剩余请求的代理路由:func NewRouter() *mux.Router { router := mux.NewRouter().StrictSlash(true) // 先注册自定义的FooHandler路由 for _, route := range routes { var handler http.Handler handler = route.HandlerFunc handler = common.RecoverHandler(handler) router. Methods(route.Method). Path(route.Pattern). Name(route.Name). Handler(handler) } // 添加代理兜底路由:匹配所有未被前面路由命中的请求 proxyHandler := common.RecoverHandler(http.HandlerFunc(ProxyProcess)) router.PathPrefix("/").Handler(proxyHandler) return router }删除main函数中的冗余代码:
删掉http.HandleFunc("/", ProxyProcess),因为现在代理逻辑已经注册到mux路由里了。
关键说明
- mux路由的匹配顺序是先注册先匹配,所以必须把代理兜底路由放在自定义路由之后,确保
/api/v1/foo请求优先被FooHandler处理。 - 使用
PathPrefix("/")可以匹配所有以/开头的路径(也就是所有请求),完美作为兜底逻辑。
修改后的验证
- 访问
/api/v1/foo(POST方法)会触发FooHandler返回"foo"。 - 访问其他任意路径,都会被转发到
http://127.0.0.5:20015的代理服务。
内容的提问来源于stack exchange,提问作者van
相关产品推荐
相关产品推荐

