在用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