Write the Code. Change the World.

11月 19

一个完整的框架,有很多部分组成。而路由,是很重要,也是比较接近用户行为的一环。今天,就尝试一下 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"
}

类比,这样写,就可以自动智能匹配。不过,个人还是偏向指定映射。这样更清晰也可以定义更可爱好听的名字。

下一步

路由往往会和路由分组和中间件紧密相连。如果是接口,接口前缀就会更能提现出来分组的作用。中间件是很重要的一环,比如权限控制,比如对请求进行特殊处理,对返回特殊处理等等。下一步就先规划规划路由分组。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注