# 路由设置

## 默认处理函数

```
beego.Router("/users", &controllers.UserController{})
```

如上的路由规则，会把`/users`的GET、POST等请求方法自动映射到UserController的Get、Post同名函数

## 自定义处理函数

上面的路由规则默认将请求方法与处理函数做了映射。

当然，我们可以显示地设置将请求路径为`/users`，请求方法为`get`的HTTP请求，路由到`UserController`的`List()`函数，而不绑定默认的`Get()`方法。此时，路由规划如下：

```
beego.Router("/", &controllers.UserController{}, "get:List")
```

**注意：**

如果为get方法显示绑定了处理函数，那么该路径的所有方法都要显示绑定，否则会报404。

比如有如下两个API

```
GET    /users
POST    /users
```

那么在router中应该也要为post显示设置处理函数`post:Post`，否则post请求会报404

```
beego.Router("/users", &controllers.UserController{}, "get:List;post:Post")
```

## 正则路由

为了用户更加方便的路由设置，beego 参考了 sinatra 的路由实现，支持多种方式的路由：

* beego.Router(“/api/?:id”, \&controllers.RController{})

  默认匹配 //例如对于URL”/api/123”可以匹配成功，此时变量”:id”值为”123”
* beego.Router(“/api/:id”, \&controllers.RController{})

  默认匹配 //例如对于URL”/api/123”可以匹配成功，此时变量”:id”值为”123”，但URL”/api/“匹配失败
* beego.Router(“/api/:id(\[0-9]+)“, \&controllers.RController{})

  自定义正则匹配 //例如对于URL”/api/123”可以匹配成功，此时变量”:id”值为”123”
* beego.Router(“/user/:username(\[\w]+)“, \&controllers.RController{})

正则字符串匹配 //例如对于URL”/user/astaxie”可以匹配成功，此时变量”:username”值为”astaxie”

* beego.Router(“/download/*.*”, \&controllers.RController{})

  匹配方式 //例如对于URL”/download/file/api.xml”可以匹配成功，此时变量”:path”值为”file/api”， “:ext”值为”xml”
* beego.Router(“/download/ceshi/\*“, \&controllers.RController{})

  全匹配方式 //例如对于URL”/download/ceshi/file/api.json”可以匹配成功，此时变量”:splat”值为”file/api.json”
* beego.Router(“/:id:int”, \&controllers.RController{})

  int 类型设置方式，匹配 :id为int 类型，框架帮你实现了正则 (\[0-9]+)
* beego.Router(“/:hi:string”, \&controllers.RController{})

  string 类型设置方式，匹配 :hi 为 string 类型。框架帮你实现了正则 (\[\w]+)
* beego.Router(“/cms\_:id(\[0-9]+).html”, \&controllers.CmsController{})

带有前缀的自定义正则 //匹配 :id 为正则类型。匹配 cms\_123.html 这样的 url :id = 123

可以在 Controller 中通过如下方式获取上面的变量：

```
this.Ctx.Input.Param(":id")
this.Ctx.Input.Param(":username")
this.Ctx.Input.Param(":splat")
this.Ctx.Input.Param(":path")
this.Ctx.Input.Param(":ext")
```
