IRIS智能路由使用

目录结构

主目录smartContract

  1. —— main.go

代码示例

main.go

  1. package main
  2. import (
  3. "github.com/kataras/iris"
  4. "fmt"
  5. "github.com/jmespath/go-jmespath"
  6. "github.com/kataras/iris/context"
  7. "github.com/kataras/iris/hero"
  8. "strings"
  9. )
  10. /*
  11. $ go get github.com/jmespath/go-jmespath
  12. */
  13. func newApp() *iris.Application {
  14. app := iris.New()
  15. // PartyFunc 等同于 usersRouter := app.Party("/users")
  16. //但它为我们提供了一种简单的方法来调用路由组的注册路由方法,
  17. //即来自另一个可以处理这组路由的包的函数。
  18. app.PartyFunc("/users", registerUsersRoutes)
  19. return app
  20. }
  21. func main() {
  22. app := newApp()
  23. // http://localhost:8080/users?query=[?Name == 'John Doe'].Age
  24. // < - 客户端将收到用户的年龄,他的名字是John Doe
  25. //您还可以测试query = [0] .Name以检索第一个用户的名称。
  26. //甚至query= [0:3].Age打印前三个年龄段。
  27. //了解有关jmespath以及如何过滤的更多信息:
  28. // http://jmespath.readthedocs.io/en/latest/ and
  29. // https://github.com/jmespath/go-jmespath/tree/master/fuzz/testdata
  30. // http://localhost:8080/users
  31. // http://localhost:8080/users/William%20Woe
  32. // http://localhost:8080/users/William%20Woe/age
  33. app.Run(iris.Addr(":8080"))
  34. }
  35. /*
  36. 开始使用路由
  37. */
  38. func registerUsersRoutes(usersRouter iris.Party) {
  39. // GET: /users
  40. usersRouter.Get("/", getAllUsersHandler)
  41. usersRouter.PartyFunc("/{name:string}", registerUserRoutes)
  42. }
  43. type user struct {
  44. Name string `json:"name"`
  45. Age int `json:"age"`
  46. }
  47. var usersSample = []*user{
  48. {"William Woe", 25},
  49. {"Mary Moe", 15},
  50. {"John Doe", 17},
  51. }
  52. func getAllUsersHandler(ctx iris.Context) {
  53. err := sendJSON(ctx, usersSample)
  54. if err != nil {
  55. fail(ctx, iris.StatusInternalServerError, "unable to send a list of all users: %v", err)
  56. return
  57. }
  58. }
  59. //开始使用 USERS路由组的子路由组
  60. func registerUserRoutes(userRouter iris.Party) {
  61. //为此子路由器创建一个新的依赖注入管理器
  62. userDeps := hero.New()
  63. //你也可以使用global/package-level的hero.Register(userDependency),正如我们在其他例子中已经学到的那样。
  64. userDeps.Register(userDependency)
  65. // GET: /users/{name:string}
  66. userRouter.Get("/", userDeps.Handler(getUserHandler))
  67. // GET: /users/{name:string}/age
  68. userRouter.Get("/age", userDeps.Handler(getUserAgeHandler))
  69. }
  70. var userDependency = func(ctx iris.Context) *user {
  71. name := strings.Title(ctx.Params().Get("name"))
  72. for _, u := range usersSample {
  73. if u.Name == name {
  74. return u
  75. }
  76. }
  77. // you may want or no to handle the error here, either way the main route handler
  78. // is going to be executed, always. A dynamic dependency(per-request) is not a middleware, so things like `ctx.Next()` or `ctx.StopExecution()`
  79. // do not apply here, look the `getUserHandler`'s first lines; we stop/exit the handler manually
  80. // if the received user is nil but depending on your app's needs, it is possible to do other things too.
  81. // A dynamic dependency like this can return more output values, i.e (*user, bool).
  82. //你可能想要或不想在这里处理错误,无论是主路由处理程序
  83. //将永远执行。 动态依赖(每个请求)不是中间件,所以像`ctx.Next()`或`ctx.StopExecution()`
  84. //不要在这里申请,看看`getUserHandler`的第一行; 我们手动停止/退出处理程序
  85. //如果收到的用户是零,但根据您的应用程序的需要,也可以做其他事情。
  86. //像这样的动态依赖可以返回更多的输出值,即(*user,bool)。
  87. fail(ctx, iris.StatusNotFound, "user with name '%s' not found", name)
  88. return nil
  89. }
  90. func getUserHandler(ctx iris.Context, u *user) {
  91. if u == nil {
  92. return
  93. }
  94. sendJSON(ctx, u)
  95. }
  96. func getUserAgeHandler(ctx iris.Context, u *user) {
  97. if u == nil {
  98. return
  99. }
  100. ctx.Writef("%d", u.Age)
  101. }
  102. /*请记住,使用'hero'可以获得类似mvc的函数,所以这也可以工作:
  103. func getUserAgeHandler(u *user) string {
  104. if u == nil {
  105. return ""
  106. }
  107. return fmt.Sprintf("%d", u.Age)
  108. }
  109. */
  110. /* ENDERS USERS.USER SUB ROUTER */
  111. /* 用户路由器结束 */
  112. //可选择手动HTTP错误的常见JSON响应。
  113. type httpError struct {
  114. Code int `json:"code"`
  115. Reason string `json:"reason"`
  116. }
  117. func (h httpError) Error() string {
  118. return fmt.Sprintf("Status Code: %d\nReason: %s", h.Code, h.Reason)
  119. }
  120. func fail(ctx context.Context, statusCode int, format string, a ...interface{}) {
  121. err := httpError{
  122. Code: statusCode,
  123. Reason: fmt.Sprintf(format, a...),
  124. }
  125. //记录所有> = 500内部错误。
  126. if statusCode >= 500 {
  127. ctx.Application().Logger().Error(err)
  128. }
  129. ctx.StatusCode(statusCode)
  130. ctx.JSON(err)
  131. //没有下一个处理程序将运行。
  132. ctx.StopExecution()
  133. }
  134. // JSON辅助函数,为最终用户提供插入字符或过滤响应的能力,您可以选择这样做。
  135. //如果您想在Iris的Context中看到该函数,则会引发[Feature Request]问题并链接此示例。
  136. func sendJSON(ctx iris.Context, resp interface{}) (err error) {
  137. indent := ctx.URLParamDefault("indent", " ")
  138. // i.e [?Name == 'John Doe'].Age # to output the [age] of a user which his name is "John Doe".
  139. if query := ctx.URLParam("query"); query != "" && query != "[]" {
  140. resp, err = jmespath.Search(query, resp)
  141. if err != nil {
  142. return
  143. }
  144. }
  145. _, err = ctx.JSON(resp, context.JSON{Indent: indent, UnescapeHTML: true})
  146. return err
  147. }