Go语言WEB框架:路由注册

23 篇文章 1 订阅

路由注册

路由注册用于建立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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go lang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值