在用beego作restful路由的时候,遇到了除了GTE、POST以外的HTTP请求,好比 PUT、PATCH、delete请求没法经过路由认证,报错误:405 METHOD NOT ALLOW。在参考官网后,发现本身过滤器能够改变HTTP请求方式。前端
好比前端 JQUERY ajax发送DELETE请求git
$.post(url, {id:id, _method:"DELETE", _xsrf:xsrf_token}, function (data) { processAjaxReturnData(data) });
虽然beego支持restful路由,可是直接请求是没法请请求通的,须要过滤器处理。github
文件main.goajax
package mainrestful
......mvc
func init() { // 支持表单伪造PUT,DELETE,PATCH,OPTIONS请求 beego.InsertFilter("*", beego.BeforeRouter, handlers.RestfulHandler()) }post
func main() { ...... beego.Run() }url
这样就构建了一个过滤器,用于将带有_method的请求方式直接赋在请求头上。rest
文件 /beego_admin_template/handlers/restfulHandler.gocode
package handlers import ( "github.com/astaxie/beego/context" ) var supportMethod = [6]string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"} // 支持伪造restful风格的http请求 // _method = "DELETE" 即将http的POST请求改成DELETE请求 func RestfulHandler() func(ctx *context.Context) { var restfulHandler = func(ctx *context.Context) { // 获取隐藏请求 requestMethod := ctx.Input.Query("_method") if requestMethod == ""{ // 正常请求 requestMethod = ctx.Input.Method() } // 判断当前请求是否在容许请求内 flag := false for _, method := range supportMethod{ if method == requestMethod { flag = true break } } // 方法请求 if flag == false { ctx.ResponseWriter.WriteHeader(405) ctx.Output.Body([]byte("Method Not Allow")) return } // 伪造请求方式 if requestMethod != "" && ctx.Input.IsPost() { ctx.Request.Method = requestMethod } } return restfulHandler }
过滤器我的认为相似于中间件,能够在处理业务逻辑以前,进行一些必要的处理,好比请求验证、权限认证、强制跳转等等。在上一篇beego的验证码处理就看到了这样的一句代码
// create filter for serve captcha image beego.InsertFilter(cpt.URLPrefix+"*", beego.BeforeRouter, cpt.Handler)
这是专门为验证码图片进行的处理,表示在beego路由处理以前,用cpt.Handler方法处理验证码图片。
官网具体使用方式能够参考 https://beego.me/docs/mvc/controller/filter.md