• 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

  • 相关阅读:
    Jupyter notbook快捷键
    tensorboard 的使用
    numpy——数组存取
    numpy——使用函数创建(2)
    numpy——使用array创建(1)
    python列表与元组
    python 格式化输出
    全排列递归算法
    【机器学习】ex1-线性回归
    【Web安全】三、SQL盲注
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/11048541.html
Copyright © 2020-2023  润新知