beego框架(golang)學習過濾器(實現restful請求)

過濾器

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

相關文章
相關標籤/搜索