Iris 拥有你见过的的最简单和强大路由处理。

Iris 自己拥有用于路由路径语法解析和判定的解释器(就像一门编程语言)。

它是快速的。它计算它的需求,如果没有特殊的正则需要,它仅仅会使用低级的路径语法来注册路由,除此之外,它预编译正则,然后加入到必需的中间件中。这就意味着与其他的路由器或者 web 框架相比,你的性能成本为零。

参数

一个路径参数的名字应该仅仅包含 字母。数字和类似 "_" 这样的符号是 不允许的

不要迷惑于 ctx.Params()ctx.Values()

  • 路径的参数值可以通过 ctx.Params() 取出。
  • ctx 中用于处理器与中间件之间通信的本地存储可以存储在 ctx.Values() 中。

下表是内建可用的参数类型:

参数类型 golang类型 取值范围 取值方式
:string string 任何值(单个字段路径) 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
: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
示例:
app.Get("/users/{id:uint64}", func(ctx iris.Context){
    id := ctx.Params().GetUint64Default("id", 0)
    // [...]
})

内建函数

内建函数 参数类型
regexp(expr string) :string
prefix(prefix string) :string
suffix(suffix string) :string
contains(s string) :string
min(最小值),接收:int,int8,int16,int32,int64,uint8
uint16,uint32,uint64,float32,float64)
:string(字符长度),:int,:int16,:int32,:int64
:uint,:uint16,:uint32,:uint64
max(最大值),接收:int,int8,int16,int32,int64,uint8
uint16,uint32,uint64,float32,float64)
:string(字符长度),:int,:int16,:int32,:int64
:uint,:uint16,:uint32,:uint64
range(最小值,最大值),接收:int,int8,int16,int32,int64,uint8
uint16,uint32,uint64,float32,float64)
:int,:int16,:int32,:int64
:uint,:uint16,:uint32,:uint64
示例:
app.Get("/profile/{name:alphabetical max(255)}", func(ctx iris.Context){
    name := ctx.Params().Get("name")
    // len(name) <=255 otherwise this route will fire 404 Not Found
    // and this handler will not be executed at all.
})

自己做

RegisterFunc 可以接受任何返回 func(paramValue string) bool 的函数。如果验证失败将会触发 404 或者任意 else关键字拥有的状态码。

latLonExpr := "^-?[0-9]{1,3}(?:\\.[0-9]{1,10})?$"
latLonRegex, _ := regexp.Compile(latLonExpr)

// Register your custom argument-less macro function to the :string param type.
// MatchString is a type of func(string) bool, so we use it as it is.
app.Macros().Get("string").RegisterFunc("coordinate", latLonRegex.MatchString)

app.Get("/coordinates/{lat:string coordinate()}/{lon:string coordinate()}",
func(ctx iris.Context) {
    ctx.Writef("Lat: %s | Lon: %s", ctx.Params().Get("lat"), ctx.Params().Get("lon"))
})

注册接受两个 int 参数的自定义的宏函数。

app.Macros().Get("string").RegisterFunc("range",
func(minLength, maxLength int) func(string) bool {
    return func(paramValue string) bool {
        return len(paramValue) >= minLength && len(paramValue) <= maxLength
    }
})

app.Get("/limitchar/{name:string range(1,200) else 400}", func(ctx iris.Context) {
    name := ctx.Params().Get("name")
    ctx.Writef(`Hello %s | the name should be between 1 and 200 characters length
    otherwise this handler will not be executed`, name)
})

注册接受一个 []string 参数的自定义的宏函数。

app.Macros().Get("string").RegisterFunc("has",
func(validNames []string) func(string) bool {
    return func(paramValue string) bool {
        for _, validName := range validNames {
            if validName == paramValue {
                return true
            }
        }

        return false
    }
})

app.Get("/static_validation/{name:string has([kataras,maropoulos])}",
func(ctx iris.Context) {
    name := ctx.Params().Get("name")
    ctx.Writef(`Hello %s | the name should be "kataras" or "maropoulos"
    otherwise this handler will not be executed`, name)
})

示例代码:

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

    // This handler will match /user/john but will not match neither /user/ or /user.
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("Hello %s", name)
    })

    // This handler will match /users/42
    // but will not match /users/-1 because uint should be bigger than zero
    // neither /users or /users/.
    app.Get("/users/{id:uint64}", func(ctx iris.Context) {
        id := ctx.Params().GetUint64Default("id", 0)
        ctx.Writef("User with ID: %d", id)
    })

    // However, this one will match /user/john/send and also /user/john/everything/else/here
    // but will not match /user/john neither /user/john/.
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        action := ctx.Params().Get("action")
        message := name + " is " + action
        ctx.WriteString(message)
    })

    app.Run(iris.Addr(":8080"))
}

当没有指定参数类型时,默认为 string,因此 {name:string}{name} 是完全相同的。

文档更新时间: 2020-08-14 10:49   作者:kuteng