iris 动态路由参数

iris 拥有最简单、最强大的路由处理能力。Iris 有自己的路由解释器,可以解析路径声明语法、动态路径参数以及进行计算。

iris 路由语法解释器称为「宏」(Macros)。它不仅支持最基本的路由声明,而且支持正则表达式。

1. 简单的路由声明

package main
import "github.com/kataras/iris"

func main() {
    app := iris.New()
    
    // 获取路由参数name
    app.Get("/username/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.WriteString("name=" + name)
    })
    app.Run(iris.Addr(":8000")
}

运行程序,浏览器中输入地址:http://localhost:8000/username/aizws ,你就会看到浏览器输出 name=aizws。

2. 带参数类型的路由声明

package main
import "github.com/kataras/iris"

func main() {
    app := iris.New()
    
    // 获取路由参数id
    app.Get("/userid/{id:int}", func(ctx iris.Context) {
        id := ctx.Params().Get("id")
        ctx.WriteString("id=" + id)
    })
    app.Run(iris.Addr(":8000")
}

其中 {id:int} 声明了参数是整形,如果其它类型的参数,比如字符串就无法匹配。

运行程序,浏览器中输入地址:http://localhost:8000/userid/100 ,你就会看到浏览器输出 id=100。

如果输入 http://localhost:8000/userid/aizws,那么浏览器会输出 Not Found,因为 aizws 不是整数,无法匹配。

3. 带函数的路由声明

package main
import "github.com/kataras/iris"

func main() {
    app := iris.New()
    
    // 获取路由参数id
    app.Get("/userid/{id:int max(99)}", func(ctx iris.Context) {
        id := ctx.Params().Get("id")
        ctx.WriteString("id=" + id)
    })
    app.Run(iris.Addr(":8000")
}

其中 {id:int max(2)} 声明了参数是整形,而且最大值为 99。

运行程序,浏览器中输入地址:http://localhost:8000/userid/88 ,你就会看到浏览器输出 id=88。

如果输入 http://localhost:8000/userid/100,那么浏览器会输出 Not Found。因为 100 已超出设定的最大值 99,所以无法匹配。

4. 使用正则表达式的路由声明

package main
import "github.com/kataras/iris"

func main() {
    app := iris.New()
    
    // 获取路由参数name
    app.Get("/username/{name:regexp(^[a-z]+)}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.WriteString("name=" + name)
    })
    app.Run(iris.Addr(":8000")
}

其中 {name:regexp(^[a-z]+)} 声明了参数必须是小写字母,其中 ^[a-z]+) 是一个正则表达式。

运行程序,浏览器中输入地址:http://localhost:8000/username/aizws ,你就会看到浏览器输出 name=aizws

如果输入 http://localhost:8000/username/Aizws,那么浏览器会输出 Not Found。因为 Aizws 不全是小写字母,所以无法匹配。

5. 路由路径参数标准 macro 类型

+------------------------+
| {param:string}         |
+------------------------+
string type
anything

+------------------------+
| {param:int}            |
+------------------------+
int type
only numbers (0-9)

+------------------------+
| {param:long}           |
+------------------------+
int64 type
only numbers (0-9)

+------------------------+
| {param:boolean}        |
+------------------------+
bool type
only "1" or "t" or "T" or "TRUE" or "true" or "True"
or "0" or "f" or "F" or "FALSE" or "false" or "False"

+------------------------+
| {param:alphabetical}   |
+------------------------+
alphabetical/letter type
letters only (upper or lowercase)

+------------------------+
| {param:file}           |
+------------------------+
file type
letters (upper or lowercase)
numbers (0-9)
underscore (_)
dash (-)
point (.)
no spaces ! or other character

+------------------------+
| {param:path}           |
+------------------------+
path type
anything, should be the last part, more than one path segment,
i.e: /path1/path2/path3 , ctx.Params().Get("param") == "/path1/path2/path3"

如果没有设置参数类型,默认就是 string,所以 {param} == {param:string}

如果在该类型上找不到函数,那么 string 宏类型的函数将被使用。

7. 路由路径参数标准 macro 类型

除了 iris 提供的基本类型和一些默认的 「宏函数」,你也可以注册自己的。

注册一个命名的路径参数函数。

    macro.Int.RegisterFunc("min", func(minValue int) func(string) bool {
        return  func(paramValue string) bool {
            n, err  := strconv.Atoi(paramValue)
            if err !=  nil {
                return  false
            }
            return n >= minValue
        }
    })

8. 完整的范例

package main
import "github.com/kataras/iris"

func main() {
    app := iris.New()
    
    // 使用基本路由参数
    app.Get("/username/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        fmt.Println(name)
    })
    
    // 使用函数路由参数
    app.Get("/profile/{id:int min(1)}", func(ctx iris.Context) {
        i, e := ctx.Params().GetInt("id")
        if e != nil {
            ctx.WriteString("error you input")
        }
    
        ctx.WriteString(strconv.Itoa(i))
    })
    
    // 设置错误码
    app.Get("/profile/{id:int min(1)}/friends/{friendid:int max(8) else 504}", func(ctx iris.Context) {
        i, _ := ctx.Params().GetInt("id")
        getInt, _ := ctx.Params().GetInt("friendid")
        ctx.Writef("Hello id:%d looking for friend id: ",i,getInt)
    })// 如果没有传递所有路由的macros,这将抛出504错误代码而不是404.
    
    // 使用正则表达式
    app.Get("/lowercase/{name:string regexp(^[a-z]+)}", func(ctx iris.Context) {
        ctx.Writef("name should be only lowercase, otherwise this handler will never executed: %s", ctx.Params().Get("name"))
    })
    
    app.Run(iris.Addr(":8000"))
}
 

下一章:iris 路由命名

iris 路由可以设置名称是比较简单的,因为我们只需要设置返回的 *Route 实例的 Name 字段即可。package mainimport ( "github.com/kataras/iris ...