過濾器
在用beego做restful路由的時候,遇到了除了GTE、POST之外的HTTP請求,比如 PUT、PATCH、delete請求無法通過路由認證,報錯誤:405 METHOD NOT ALLOW。在參考官網后,發現自己過濾器可以改變HTTP請求方式。
比如前端 JQUERY ajax發送DELETE請求
$.post(url, {id:id, _method:"DELETE", _xsrf:xsrf_token}, function (data) {
processAjaxReturnData(data)
});
雖然beego支持restful路由,但是直接請求是無法請請求通的,需要過濾器處理。
文件main.go
package main
......
func init() { // 支持表單偽造PUT,DELETE,PATCH,OPTIONS請求 beego.InsertFilter("*", beego.BeforeRouter, handlers.RestfulHandler()) }
func main() { ...... beego.Run() }
這樣就構建了一個過濾器,用於將帶有_method的請求方式直接賦在請求頭上。
文件 /beego_admin_template/handlers/restfulHandler.go
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