路由注册
函数注册
相关方法:
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()