beegoフレームワーク学習フィルタ(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
転載先:https://www.cnblogs.com/zhouqi666/p/11048541.html