关于跨域的说明,请参考 http://www.ruanyifeng.com/blog/2016/04/cors.html
更新:作者已更新cross_origin.go,新的写法是:
frame.NamedAPI("QueryMenuList","GET OPTIONS","/api/v1/webs/get/query_menu_list", webs.QueryMenuList()).Use(tgMiddleware.CrossOrigin)
下面是基于网友畅雨的解决办法整理出来的。
1、router路由中,需要添加OPTIONS的处理方法
tgMiddleware "github.com/henrylee2cn/faygo/ext/middleware"
// QueryMenuList
frame.NamedAPI("QueryMenuList","GET","/api/v1/webs/get/query_menu_list", webs.QueryMenuList()).Use(tgMiddleware.CrossOrigin)
frame.NamedOPTIONS("QueryMenuList","/api/v1/webs/get/query_menu_list", webs.DelwithOptions()).Use(tgMiddleware.CrossOrigin)
2、api webs处理单元中,增加方法 DelwithOptions,对应执行OPTIONS请求的处理
func DelwithOptions() faygo.HandlerFunc {
return func(c *faygo.Context) error{
return nil
}
}
3、faygo自带的middleware cross_origin.go 中,需要修改成
// CrossOrigin creates Cross-Domain middleware
var CrossOrigin = faygo.HandlerFunc(func(ctx *faygo.Context) error {
ctx.SetHeader(faygo.HeaderAccessControlAllowOrigin, ctx.HeaderParam(faygo.HeaderOrigin))
ctx.SetHeader(faygo.HeaderAccessControlAllowMethods,"POST, GET, OPTIONS, PUT, DELETE")
ctx.SetHeader(faygo.HeaderAccessControlAllowCredentials,"true")
ctx.SetHeader(faygo.HeaderAccessControlAllowHeaders,
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
ctx.SetHeader(faygo.HeaderAccessControlMaxAge,"172800")// 加上此参数,不用每次请求都发OPTIONS
return nil
})
4、前端是用react,在fetchOptions中,需要添加
credentials:'include',
注意:mode: 'cors' //这个参数不用。
建议:faygo修改下cross_origin.go,添加上面的内容。
另外,就是对每个api的路由定义,都要加上Use(tgMiddleware.CrossOrigin)和OPTIONS的处理,�faygo框架上能否提供更简化的办法?跨域(支持cookie)应该是最基本的功能,希望能整合进框架中。