一个完整的框架,有很多部分组成。而路由,是很重要,也是比较接近用户行为的一环。今天,就尝试一下 iris 的路由的使用。
操作一波
从 zero 开始操作一波。
# favor 眷顾
mkdir favor
cd favor
go mod init favor
touch main.go
我们开始往 main.go 里边注入代码。
package main
import (
"favor/app/http/controllers"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/mvc"
)
func main() {
app := iris.New()
mvc.Configure(app.Party("/api"), interfaceMvc)
app.Run(iris.Addr(":8080"))
}
func interfaceMvc(app *mvc.Application) {
app.Router.Use(func(ctx iris.Context) {
ctx.Application().Logger().Infof("Path: %s", ctx.Path())
ctx.Next()
})
app.Party("/user").Handle(new(controllers.UserController))
}
上边, Handle 指向了 UserController 。可还没建呢。依照 laravel
的习惯,我们新建目录:app/http/controllers, 然后在里边新建 user_controller.go 文件,然后注入代码。
package controllers
import (
. "fmt"
"github.com/kataras/iris/v12/mvc"
)
type UserController struct {
}
func (c *UserController) BeforeActivation(b mvc.BeforeActivation) {
Println("BeforeActivation")
b.Handle("GET", "/permissions", "GetPermissions")
}
func (c *UserController) AfterActivation(a mvc.AfterActivation) {
Println("AfterActivation")
}
func (c *UserController) GetPermissions() string {
return "getPermissions"
}
func (c *UserController) Get() string {
return "get"
}
到此,代码已经完毕。go mod 的原因,import 的时候,带上 favor 即可。package 也要对应好。
go run main.go
跑起来。
在 postman 中,我们发起两个 get 请求。
# 返回 get 字符串
http://localhost:8080/api/user
# 返回 getPermissions 字符串
http://localhost:8080/api/permissions
发现,返回了我们想要看到的。
这时候,你会发现 UserController 中的 Get 方法,并没有在 BeforeActivation 中进行映射。是的,mvc 默认就会这样做。如果我们把 BeforeActivation 中的 b.Handle("GET", "/permissions", "GetPermissions") 注释掉,一样可以得到结果。比如:
# post 请求
/api/user/roles
func (c *UserController)PostRoles() string {
return "roles"
}
类比,这样写,就可以自动智能匹配。不过,个人还是偏向指定映射。这样更清晰也可以定义更可爱好听的名字。
下一步
路由往往会和路由分组和中间件紧密相连。如果是接口,接口前缀就会更能提现出来分组的作用。中间件是很重要的一环,比如权限控制,比如对请求进行特殊处理,对返回特殊处理等等。下一步就先规划规划路由分组。