Wego Web Framework | GitHub 开发文档 开发社区
快速入门
Web模块
ORM模块
其他模块

路由与控制器

路由注册

路由注册用于建立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支持三种路由类型的注册:

以下代码分别注册了三种类型的路由:


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支持三种类型的处理器函数:

以下是三种类型的处理器的示例代码:


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
*/