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


過濾器

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM