路由注册
路由注册用于建立URL路径与处理器函数(也可以叫控制器函数)的对应关系。一条路由规则由三部分组成:
- http请求方法
- url路径
- 处理器函数
以下代码注册了一个处理器函数:Hello,当用户在浏览器访问http://localhost:8080/hello时,Web框架将调用Hello处理器函数来处理浏览器的请求:
func Hello(c *wego.WebContext) {
c.WriteText(200, "world")
}
func main() {
web, err := wego.NewWeb()
if err != nil{
log.Error(err)
return
}
web.PATH("/hello", Hello)
err = web.Run(":8080")
if err != nil {
log.Error(err)
}
}
路由类型
wego支持三种路由类型的注册:
- 静态路由(路由pattern与url的path完全一致)
- 参数路由(路由pattern中除了冒号所在“段”,其他部分必须与url的path中对应部分完全一致, 例如:/user/:id 匹配:/user/666,但不匹配/user/666/tom)
- 模糊匹配路由(路由pattern中星号之前内容的需要与url的path中对应部分完全一致, 例如:/user/*info匹配/user/666/user/666/tom)
以下代码分别注册了三种类型的路由:
func TestRoutePattern(t *testing.T) {
web, err := wego.NewWeb()
if err != nil{
t.Error(err)
return
}
//注册静态路由
web.PATH("/static", func(c *wego.WebContext) {
c.WriteText(200, "this is a static route")
})
//注册参数路由
web.PATH("/user/:id", func(c *wego.WebContext) {
c.WriteTextF(200, "param id=%s", c.RouteParam.GetString("id").Value)
})
//注册模糊匹配路由
web.PATH("/files/*name", func(c *wego.WebContext) {
c.WriteTextF(200, "param name=%s", c.RouteParam.GetString("name").Value)
})
}
RESTful路由
wego支持RESTful模式的路由的注册,以下是wego所支持的RESTful方法:
const (
MethodGet = "GET"
MethodPost = "POST"
MethodPut = "PUT"
MethodPatch = "PATCH"
MethodDelete = "DELETE"
)
示例代码:
func TestRouteRestful(t *testing.T) {
web, err := wego.NewWeb()
if err != nil{
t.Error(err)
return
}
web.GET("/users/:id", func(c *wego.WebContext) {
//查询一个用户
})
web.POST("/users/:id", func(c *wego.WebContext) {
//创建一个用户
})
web.PUT("/users/:id", func(c *wego.WebContext) {
//更新用户信息
})
web.PATCH("/users/:id", func(c *wego.WebContext) {
//更新用户的部分信息
})
web.DELETE("/user/666", func(c *wego.WebContext) {
//删除用户
})
}
处理器类型
wego支持三种类型的处理器函数:
- 函数型处理器
- 方法型处理器
- GoHttp处理器
以下是三种类型的处理器的示例代码:
func handlerWegoFunc(c *wego.WebContext) {
c.WriteText(200, "hello world")
}
func handlerGoHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
type DemoController struct {
}
func (this *DemoController) WriteText(ctx *wego.WebContext) {
ctx.WriteText(200, "hello world")
}
func TestRouteHandler(t *testing.T) {
web, err := wego.NewWeb()
if err != nil{
t.Error(err)
return
}
//注册函数型处理器
web.GET("/wego_func", handlerWegoFunc)
//注册方法型处理器
web.GET("/wego_method", (*DemoController).WriteText)
//注册GoHandler处理器
web.GET("/go_hander", handlerGoHandler)
}
建议您优先使用方法型处理器来实现您的应用,采用方法型处理器来开发web可以利用Go语言面向对象的特性。
GoHttp处理器可以与原有代码很好的兼容,若用户已经采用Go语言原生处理器函数开发了代码,这种情况下使用wego不需要修改处理器函数,只需要修改注册路由注册相关的代码即可。
GoHttp处理器中获取WebContext对象
在go原生处理器函数中也可以使用WebContext对象:
func main() {
web, err := wego.NewWeb()
if err != nil{
log.Error(err)
return
}
web.GET("/go_handler", func(w http.ResponseWriter, r *http.Request) {
c := wego.GetWebContext(r)
name := c.Param.GetString("name")
c.WriteText(200, name.Value)
})
err = web.Run(":8080")
if err != nil {
log.Error(err)
}
}
分组路由
wego支持分组路由。在做api开发的时候,如果要支持多个api版本,我们可以通过分组路由来实现不同版本的api。使用分组路由的另外一个原因是基于模块化的考虑,把同样模块的功能安排到一个分组中。
示例代码:
func TestRouteGroup(t *testing.T) {
web, err := wego.NewWeb()
if err != nil{
t.Error(err)
return
}
// 创建v1组
v1 := web.NewGroup("/v1")
{
// 在v1这个分组下,注册路由
v1.POST("/login", func(c *wego.WebContext){})
v1.POST("/list", func(c *wego.WebContext){})
v1.POST("/info", func(c *wego.WebContext){})
}
// 创建v2组
v2 := web.NewGroup("/v2")
{
// 在v2这个分组下,注册路由
v2.POST("/login", func(c *wego.WebContext){})
v2.POST("/list", func(c *wego.WebContext){})
v2.POST("/info", func(c *wego.WebContext){})
}
}
/*
上面的例子将会注册下面的路由信息:
/v1/login --> wego/demo.TestRouteGroup.func1
/v1/list --> wego/demo.TestRouteGroup.func2
/v1/info --> wego/demo.TestRouteGroup.func3
/v2/login --> wego/demo.TestRouteGroup.func4
/v2/list --> wego/demo.TestRouteGroup.func5
/v2/info --> wego/demo.TestRouteGroup.func6
*/