一架梯子,一头程序猿,仰望星空!
Iris Web框架教程 > 内容正文

Go Iris路由


Go iris框架的路由绑定有两种模式,一种就是函数式、另外一种就是MVC模式,函数式就是给指定URL路径绑定一个处理函数,MVC模式就是给URL路径绑定一个控制器,框架根据控制器方法的命名规则自动生成对应的URL路径,同时自动绑定对应的控制器函数。

函数式路由绑定

iris框架最简单的路由模型,给任意URL绑定一个函数即可

func main() {
    // 创建一个带有默认中间件的iris应用程序:
    // 默认使用“debug”日志级别。
    // 支持位于“./locales”目录下的本地化。
    // HTML模板位于“./views”或“./templates”目录下。
    // 访问日志保存在“./access.log”中,
    // 同时已经附加了恢复(无崩溃)和请求ID中间件。
    app := iris.Default()

    // 根据http请求方法和路径,绑定路由函数即可,跟Gin、echo等框架的路由机制类似。
    app.Get("/someGet", getting)
    app.Post("/somePost", posting)
    app.Put("/somePut", putting)
    app.Delete("/someDelete", deleting)
    app.Patch("/somePatch", patching)
    app.Header("/someHead", head)
    app.Options("/someOptions", options)

    // 监听端口
    app.Listen(":8080")
}

路径中的参数

func main() {
    app := iris.Default()

    // 这个处理器将匹配 /user/john 但不匹配 /user/ 或 /user
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("Hello %s", name)
    })

    // 然而,这个处理器将匹配 /user/john/ 和 /user/john/send
    // 如果没有其他路由匹配 /user/john,它将重定向到 /user/john/
    app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        action := ctx.Params().Get("action")
        message := name + "是" + action
        ctx.WriteString(message)
    })

    // 对于每个匹配的请求,Context 将保存路由定义
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
    })

    app.Listen(":8080")
}

可用的内置参数类型:

参数类型 Go 类型 验证条件 获取方法
:string string 任何字符(单个路径段) Params().Get
:uuid string uuidv4 或 v1 格式(单个路径段) Params().Get
:int int -9223372036854775808 到 9223372036854775807(x64)或 -2147483648 到 2147483647(x32),取决于主机体系结构 Params().GetInt
:int8 int8 -128 到 127 Params().GetInt8
:int16 int16 -32768 到 32767 Params().GetInt16
:int32 int32 -2147483648 到 2147483647 Params().GetInt32
:int64 int64 -9223372036854775808 到 9223372036854775807 Params().GetInt64
:uint uint 0 到 18446744073709551615(x64)或 0 到 4294967295(x32),取决于主机体系结构 Params().GetUint
:uint8 uint8 0 到 255 Params().GetUint8
:uint16 uint16 0 到 65535 Params().GetUint16
:uint32 uint32 0 到 4294967295 Params().GetUint32
:uint64 uint64 0 到 18446744073709551615 Params().GetUint64
:bool bool “1” 或 “t” 或 “T” 或 “TRUE” 或 “true” 或 “True” 或 “0” 或 “f” 或 “F” 或 “FALSE” 或 “false” 或 “False” Params().GetBool
:alphabetical string 小写或大写字母 Params().Get
:file string 小写或大写字母、数字、下划线(_)、破折号(-)、点(.),不能包含空格或其他文件名无效的特殊字符 Params().Get
:path string 任意字符,可以由斜杠(路径段)分隔,但应为路由路径的最后一部分 Params().Get
:mail string 电子邮件,不验证域 Params().Get
:email string 电子邮件,验证域 Params().Get
:date string yyyy/mm/dd 格式,例如 /blog/{param:date} 匹配 /blog/2022/04/21 Params().GetTimeParams().SimpleDate
:weekday uint (0-6) 或 string string 格式为 time.Weekday 的长名称(”sunday” 到 “monday” 或 “Sunday” 到 “Monday”),例如 /schedule/{param:weekday} 匹配 /schedule/monday Params().GetWeekday

分组路由

有时候需要做API版本管理,或者为一个大模块的路由设置统一的前缀,这个时候就用到了路由分组能力。

func main() {
    app := iris.Default()

    // 简单分组: v1
    v1 := app.Party("/v1")
    {
        v1.Post("/login", loginEndpoint)
        v1.Post("/submit", submitEndpoint)
        v1.Post("/read", readEndpoint)
    }

    // 简单分组: v2
    v2 := app.Party("/v2")
    {
        v2.Post("/login", loginEndpoint)
        v2.Post("/submit", submitEndpoint)
        v2.Post("/read", readEndpoint)
    }

    app.Listen(":8080")
}

MVC路由

Go iris框架支持MVC架构,通过一定的规则将路由映射到指定的控制器函数中。

package main

import (
    "strings"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/logger"
    "github.com/kataras/iris/v12/middleware/recover"
    "github.com/kataras/iris/v12/mvc"
)



// 创建iris应用
func newApp() *iris.Application {
    app := iris.New()
    // 设置两个中间件
    // recover用于拦截panic错误,避免程序异常退出
    // logger 用于记录请求日志
    app.Use(recover.New())
    app.Use(logger.New())

    // 这里将控制器注册到  "/" 跟路由.
    mvc.New(app).Handle(new(ExampleController))

    // 也可以借助路由组注册到指定路径下面
    // 例子:  控制器注册到/books路径下面
    // mvc.New(app.Party("/books")).Handle(new(ExampleController))
}

func main() {
    // 创建应用
    app := newApp()

    // http://localhost:8080
    // http://localhost:8080/ping
    // http://localhost:8080/hello
    // http://localhost:8080/custom_path
    app.Listen(":8080")
}

// 定义ExampleController 控制器,处理下面几个路径请求 "/", "/ping" and "/hello".
type ExampleController struct{}

// 处理GET请求
// 请求地址: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
    return mvc.Response{
        ContentType: "text/html",
        Text:        "<h1>Welcome</h1>",
    }
}

// GetPing serves
// Method:   GET
// 请求地址: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
    return "pong"
}

// GetHello serves
// Method:   GET
// 请求地址: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
    return map[string]string{"message": "Hello Iris!"}
}

// GetHelloWorld serves
// Method:   GET
// 请求地址: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
    return map[string]string{"message": "Hello Iris! DefaultPath"}
}

MVC的路由跟控制函数命名规则的关系。

路由地址:路由分组 + Http方法名 + 函数单词(小写)

例如:

func (c *ExampleController) GetPing() string {
    return "pong"
}

因为没有设置路由分组,这个函数能够处理http://localhost:8080/ping 路由的GET请求