[gogf/gf]利用gf做api开发的几点问题

2024-06-25 369 views
0

最近根据一些功能需求,原本使用python和php构建的各种api接口需要用go重写,在框架选择上遇到一些问题吧,我之前用过beego框架,

beego.NSNamespace("/schedule",
            beego.NSBefore(Auth),
            beego.NSRouter("/listdir", &controllers.ScheduleController{}, "post:ListDir"),
        ),
        //beego.NSNamespace("/ws",
        //  beego.NSBefore(Auth),&controllers.WebSocketController{}),
        beego.NSNamespace("/task",
            beego.NSBefore(Auth),
            beego.NSRouter("/add", &controllers.TaskController{}, "post:AddTask"),
        ),

beego框架对api的支持非常好,本身的路由支持多层的嵌套,同样对比gf的分组路由,感觉实现起来有点蒙圈。但实际上,由于公司本身api提供大量的定时任务,需要做到定时执行,并且将执行结果写入mongo数据库中,而这些其实是gf框架比较吸引我的地方。从目前情况看,感觉gf对api的开发对比beego还有一定的欠缺,希望在后期能有一定的提升

回答

8

一点小小的拙见,请各位go语言开发前辈多多指教,毕竟我对go也算是初入门径

0

可能是惯性思维的问题,我以前也是用beego的。多看两次例子就好了。 看看下面这个例子能不能解开你的疑惑。

type ScheduleController struct {
    gmvc.Controller
}

type TaskController struct {
    gmvc.Controller
}

func (c *ScheduleController) ListDir() {
    c.Response.Writeln("ListDir")
}

func (c *TaskController) AddTask() {
    c.Response.Writeln("AddTask")
}

func AuthHookHandler(r *ghttp.Request) {
    c.Response.Writeln("Auth")
    //Auth
}

func main() {
    s   := g.Server()
    sCtl := new(ScheduleController)
    tCtl := new(TaskController)
    s.Group("/schedule").Bind([]ghttp.GroupItem{
        {"ALL",  "*", AuthHookHandler, ghttp.HOOK_BEFORE_SERVE},
        {"POST",  "/listdir", sCtl, "ListDir"},
    {"POST",  "/add", tCtl, "AddTask"},
    })
    s.SetPort(8199)
    s.Run()
}
8

@Alberthchang 你好,楼上回答的基本正确,不过我们推荐使用对象注册方式,并且可以使用分组路由的方式来实现批量注册,分组路由也是目前流行Web框架的路由注册方式,参考代码如下:

package main

import (
    "github.com/gogf/gf/g"
    "github.com/gogf/gf/g/net/ghttp"
)

type Schedule struct{}

type Task struct{}

func (c *Schedule) ListDir(r *ghttp.Request) {
    r.Response.Writeln("ListDir")
}

func (c *Task) Add(r *ghttp.Request) {
    r.Response.Writeln("Add")
}

func (c *Task) Task(r *ghttp.Request) {
    r.Response.Writeln("Task")
}

// 实现权限校验
// 通过事件回调,类似于中间件机制,但是可控制的粒度更细,可以精准注册到路由规则
func AuthHookHandler(r *ghttp.Request) {
    // 如果权限校验失败,调用 r.ExitAll() 退出执行流程
}

func main() {
    s := g.Server()
    s.Group("/schedule").Bind([]ghttp.GroupItem{
        {"ALL", "*", AuthHookHandler, ghttp.HOOK_BEFORE_SERVE},
        {"POST", "/schedule", new(Schedule)},
        {"POST", "/task", new(Task)},
    })
    s.SetPort(8199)
    s.Run()
}

运行结果如下: image

GF框架的功能非常强大,支持很多特性,文档也更丰富,中文本地化支持非常好,适合团队工程化开发使用。若有不清楚的欢迎随时提issue咨询。

4

好的,我明白了,已经解决了

3

需要增加更方便的层级路由注册方式。