Skip to main content

路由注册

函数注册

相关方法:

func (s *Server) BindHandler(pattern string, handler interface{})

其中handler的定义方式有如下两种:

func(request *ghttp.Request)
func(ctx context.Context, BizRequest)(BizResponse, error)

匿名函数与普通函数注册 internal/cmd/cmd.go

package cmd

import (
"context"

"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gcmd"
)

func handler(req *ghttp.Request) {
req.Response.Writeln("<h1>Hello World From handler</h1>")
}

var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()

// 直接用匿名函数进行路由注册
s.BindHandler("/hello", func(req *ghttp.Request) {
req.Response.Writeln("<h1>Hello World!</h1>")
})

// 或者使用提前定义好的函数来进行注册
s.BindHandler("/world", handler)

s.Run()
return nil
},
}
)

注册成功后在浏览器输入http://127.0.0.1:8000/hello或者http://127.0.0.1:8000/world即可访问对应的路由

指定HTTP请求方法 上述方法注册路由默认支持所有HTTP请求方法,如果需要指定请求方法,可用以下写法:

// 该路由只支持GET请求
s.BindHandler("GET:/hello", func(req *ghttp.Request) {
req.Response.Writeln("<h1>Hello World! GET</h1>")
})
// 该路由只支持POST请求
s.BindHandler("POST:/hello", func(req *ghttp.Request) {
req.Response.Writeln("<h1>Hello World! POST</h1>")
})

对于同一路由可以定义不同的请求方法实现不同功能。

几个最常用HTTP方法

方法描述
GET用于获取数据,不会修改服务端资源数据
POST将资源数据提交到服务端,常用于在服务端创建新数据
PUT将资源数据提交到服务端,常用于修改已存在的资源数据
DELETE用于删除服务端资源数据

对象方法注册

还可以用对象当中的方法来注册路由。

选定义一个名为user控制器

internal/controller/user/user.go

package user

import "github.com/gogf/gf/v2/net/ghttp"

type Controller struct{}

func New() *Controller {
return &Controller{}
}

func (c *Controller) AddUser(r *ghttp.Request) {
r.Response.Writeln("添加用户")
}

func (c *Controller) UpdateUser(r *ghttp.Request) {
r.Response.Writeln("更新用户")
}

func (c *Controller) DeleteUser(r *ghttp.Request) {
r.Response.Writeln("删除用户")
}

func (c *Controller) ListUser(r *ghttp.Request) {
r.Response.Writeln("用户列表")
}

func (c *Controller) GetUser(r *ghttp.Request) {
r.Response.Writeln("查询一个用户")
}

func (c *Controller) Post(r *ghttp.Request) {
r.Response.Writeln("添加用户")
}

func (c *Controller) Put(r *ghttp.Request) {
r.Response.Writeln("更新用户")
}

func (c *Controller) Delete(r *ghttp.Request) {
r.Response.Writeln("删除用户")
}

func (c *Controller) Get(r *ghttp.Request) {
r.Response.Writeln("查询一个用户")
}

internal/cmd/cmd.go

package cmd

import (
"context"

// 引入控制器user包
"gf_demo/internal/controller/user"

"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcmd"
)

var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()

// 定义对象
usercontroller := user.New()
// 将对象方法绑定到路由
s.BindHandler("/adduser", usercontroller.AddUser)

s.Run()
return nil
},
}
)

对象注册

对象里的方法可以批量注册

相关方法

func (s *Server) BindObject(pattern string, object interface{}, method ...string)

func (s *Server) BindObjectMethod(pattern string, object interface{}, method string)

func (s *Server) BindObjectRest(pattern string, object interface{})

绑定全部公共方法

internal/cmd/cmd.go

package cmd

import (
"context"
"starting/internal/controller/user"

"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcmd"
)

var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()

usercontroller := user.New()
// 绑定user控制器中所有公共方法
s.BindObject("/user", usercontroller)

s.Run()
return nil
},
}
)

绑定指定方法

usercontroller := user.New()
// 绑定user控制器中多个方法
s.BindObject("/user", usercontroller, "AddUser,UpdateUser")
// 绑定单个方法
s.BindObjectMethod("/deluser", usercontroller, "DeleteUser")

以RESTFul方绑定对象方法

usercontroller := user.New()
s.BindObjectRest("/user", usercontroller)

分组注册

可以为不同路由设置一个相同的前缀,即分组路由,分组路由有以下两种写法

s := g.Server()

usercontroller := user.New()
s.Group("/user", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse)
group.Bind(
usercontroller, // 绑定到控制器对象
)

// 可以用GET POST PUT等定义路由
group.GET("/get", func(r *ghttp.Request) {
r.Response.Writeln("/user/get")
})
})

s.Run()
s := g.Server()

usercontroller := user.New()
group := s.Group("/user")
group.Middleware(ghttp.MiddlewareHandlerResponse)
group.Bind(
usercontroller, // 绑定到控制器对象
)

// 可以用GET POST PUT等定义路由
group.GET("/get", func(r *ghttp.Request) {
r.Response.Writeln("/user/get")
})

s.Run()