如何在gorilla/mux中查询指定端点允许的请求方法以处理405响应
解决方案
gorilla/mux 本身不会自动把允许方法注入到自定义405 handler的响应头中,你可以通过重新匹配路由的方式获取对应端点允许的请求方法,具体实现如下:
步骤1:将路由实例传入自定义405 handler
你需要先把初始化后的*mux.Router实例传给你的MethodNotAllowedHandler,这样才能调用匹配方法:
// 初始化路由 router := mux.NewRouter() // 注册你的业务路由 router.HandleFunc("/users/{id}", yourHandlerFunc).Methods(http.MethodGet) // 绑定自定义405 handler,传入router实例 router.MethodNotAllowedHandler = MethodNotAllowedHandler(router)
步骤2:修改自定义405 handler实现,获取允许方法
import "strings" func MethodNotAllowedHandler(router *mux.Router) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var match mux.RouteMatch // 尝试匹配当前请求路径,忽略方法不匹配的错误 if router.Match(r, &match) || match.Err == mux.ErrMethodMismatch { // 提取该路由允许的所有方法 allowedMethods, err := match.Route.GetMethods() if err == nil { // 把允许方法写入Allow响应头 w.Header().Set("Allow", strings.Join(allowedMethods, ", ")) } } // 写入405状态码和自定义响应内容 w.WriteHeader(http.StatusMethodNotAllowed) w.Write([]byte("请求方法不允许,允许的方法为: " + w.Header().Get("Allow"))) }) }
注意事项
- 如果同一个路径绑定了多个请求方法,
GetMethods()会自动返回所有允许的方法,无需手动拼接 - 如果匹配不到对应路径的路由,该逻辑不会报错,你可以自行添加兜底逻辑返回通用405提示
内容的提问来源于stack exchange,提问作者Andre Suchitra
相关产品推荐
相关产品推荐

