beego框架(golang)学习过滤器(实现restful请求)
Posted zhouqi666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于beego框架(golang)学习过滤器(实现restful请求)的主要内容,如果未能解决你的问题,请参考以下文章