动态路由参数

Iris 拥有你从未遇到过的 简单的,强大的路由.

同时, Iris有自己的路径(就像编程语言一样),用于路由的路径语法及其路径参数解析和评估. 我们简称为"macros".

怎么样? 它计算了它的需求,如果没有需要任何特殊的正则表达式 那么它只是用低级路径语法注册路由,否则它预先编译正则表达式并添加必要的中间件。这意味着相对于其他路由器或Web框架 您的性能成本为零 。

路径路径参数的标准macro类型

  1. +------------------------+
  2. | {param:string} |
  3. +------------------------+
  4. string 类型
  5. 任意字符串
  6. +------------------------+
  7. | {param:int} |
  8. +------------------------+
  9. int 类型
  10. 支持数字 (0-9)(这里是组合123或者1234其他整数类型于此相同)
  11. +------------------------+
  12. | {param:long} |
  13. +------------------------+
  14. int64 type
  15. 仅仅数字 (0-9)
  16. +------------------------+
  17. | {param:boolean} |
  18. +------------------------+
  19. bool 类型
  20. 仅仅"1" 或者 "t" 或者 "T" 或者 "TRUE"或者 "true" 或者 "True"
  21. 或者 "0" 或者 "f" 或者 "F" 或者 "FALSE" 或者 "false" 或者 "False"
  22. +------------------------+
  23. | {param:alphabetical} |
  24. +------------------------+
  25. alphabetical/letter (拼音或者字母)类型
  26. letters only (大写或者小写)
  27. +------------------------+
  28. | {param:file} |
  29. +------------------------+
  30. file 类型
  31. letters (大写或者小写)
  32. numbers (0-9)
  33. underscore (_)
  34. dash (-)
  35. point (.)
  36. 没有空格 !或其他字符
  37. +------------------------+
  38. | {param:path} |
  39. +------------------------+
  40. path 类型
  41. anything,应该是最后一部分,多个路径段,
  42. 示例: /path1/path2/path3 , ctx.Params().Get("param") == "/path1/path2/path3"

如果缺少类型,则参数的类型默认为字符串,因此{param} == {param:string}。

如果在该类型上找不到函数,则使用字符串macro类型的函数。

除了Iris提供基本类型和一些默认的“macro功能”你也可以注册自己的func!

注册命名路径参数功能

  1. app.Macros().Int.RegisterFunc("min", func(argument int) func(paramValue string) bool {
  2. // [...]
  3. return true
  4. // -> true 意味着通过验证, false 表示无效的消息404,或者如果“其他500”被附加到macors语法,则内部服务器错误.
  5. })

在 func(argument …) 你可以有任何标准类型, 它将在服务器启动之前进行验证,因此不关心那里的任何性能成本,它在服务时运行的唯一事情就是返回func(paramValue string)bool。

{param:string equal(iris)} , "iris" 在这里是一个参数:

  1. app.Macros().String.RegisterFunc("equal", func(argument string) func(paramValue string) bool {
  2. return func(paramValue string){ return argument == paramValue }
  3. })

示例代码:

  1. app := iris.New()
  2. // 您可以使用“string”类型,该类型对于可以是任何内容的单个路径参数有效
  3. app.Get("/username/{name}", func(ctx iris.Context) {
  4. ctx.Writef("Hello %s", ctx.Params().Get("name"))
  5. }) // {name:string}
  6. //注册我们的第一个附加到int macro类型的宏
  7. // "min" = 当前函数名字
  8. // "minValue" = 函数的参数
  9. // func(string) bool = macro's 的路径参数评估器,这在服务时执行
  10. // 用户使用min(...)macros参数函数请求包含:int macros类型的路径。
  11. app.Macros().Int.RegisterFunc("min", func(minValue int) func(string) bool {
  12. // 在此之前做任何事情[...]
  13. //在这种情况下,我们不需要做任何事情
  14. return func(paramValue string) bool {
  15. n, err := strconv.Atoi(paramValue)
  16. if err != nil {
  17. return false
  18. }
  19. return n >= minValue
  20. }
  21. })
  22. // http://localhost:8080/profile/id>=1
  23. // 这将抛出404,即使它被发现为路线 : /profile/0, /profile/blabla, /profile/-1
  24. // macros 参数函数当然是可选的
  25. app.Get("/profile/{id:int min(1)}", func(ctx iris.Context) {
  26. // 第二个参数是错误的,因为我们使用 macros 它总是为nil
  27. // 验证已经发生了.
  28. id, _ := ctx.Params().GetInt("id")
  29. ctx.Writef("Hello id: %d", id)
  30. })
  31. // 更改每个路由的macros评估程序的错误代码:
  32. app.Get("/profile/{id:int min(1)}/friends/{friendid:int min(1) else 504}", func(ctx iris.Context) {
  33. id, _ := ctx.Params().GetInt("id")
  34. friendid, _ := ctx.Params().GetInt("friendid")
  35. ctx.Writef("Hello id: %d looking for friend id: ", id, friendid)
  36. }) // 如果没有传递所有路由的macros,这将抛出504错误代码而不是404.
  37. // http://localhost:8080/game/a-zA-Z/level/0-9
  38. //记住,字母只是小写或大写字母。
  39. app.Get("/game/{name:alphabetical}/level/{level:int}", func(ctx iris.Context) {
  40. ctx.Writef("name: %s | level: %s", ctx.Params().Get("name"), ctx.Params().Get("level"))
  41. })
  42. //让我们使用一个简单的自定义regexp来验证单个路径参数
  43. //它的值只是小写字母。
  44. // http://localhost:8080/lowercase/anylowercase
  45. app.Get("/lowercase/{name:string regexp(^[a-z]+)}", func(ctx iris.Context) {
  46. ctx.Writef("name should be only lowercase, otherwise this handler will never executed: %s", ctx.Params().Get("name"))
  47. })
  48. // http://localhost:8080/single_file/app.js
  49. app.Get("/single_file/{myfile:file}", func(ctx iris.Context) {
  50. ctx.Writef("file type validates if the parameter value has a form of a file name, got: %s", ctx.Params().Get("myfile"))
  51. })
  52. // http://localhost:8080/myfiles/any/directory/here/
  53. // 这是唯一接受任意数量路径段的macro类型。
  54. app.Get("/myfiles/{directory:path}", func(ctx iris.Context) {
  55. ctx.Writef("path type accepts any number of path segments, path after /myfiles/ is: %s", ctx.Params().Get("directory"))
  56. })
  57. app.Run(iris.Addr(":8080"))
  58. }

路径参数名称应仅包含字母。不允许使用“_”和数字等符号。

最后,不要将ctx.Params()与ctx.Values()混淆。路径参数的值转到ctx.Params()和上下文的本地存储 可以用来在处理程序和中间件之间进行通信,转到ctx.Values()。