包装路由器

443/5000非常罕见,您可能永远不需要它,但无论如何您都需要它。(以备不时之需)

有时您需要覆盖或决定是否将在传入请求上执行路由器。 如果你以前有过使用net / http和其他web框架的经验,这个函数会熟悉你(它有net / http中间件的形式,但它不接受下一个处理程序,而是接受Router作为函数 是否被执行)。

  1. // WrapperFunc用作预期的输入参数签名
  2. //用于WrapRouter。 它是一个“低级”签名,与net / http兼容。
  3. //它用于运行或不运行基于自定义逻辑的路由器。
  4. type WrapperFunc func(w http.ResponseWriter, r *http.Request, firstNextIsTheRouter http.HandlerFunc)
  5. // WrapRouter在主路由器的顶部添加了一个包装器。
  6. //通常,当需要使用像CORS这样的中间件包装整个应用程序时,它对第三方中间件很有用。
  7. //开发人员可以添加多个包装器,这些包装器的执行从最后到第一个。
  8. //这意味着第二个包装器将包装第一个,依此类推。
  9. //在构建之前。
  10. func WrapRouter(wrapperFunc WrapperFunc)

Iris的路由器基于HTTP方法搜索其路由,路由器包装器可以覆盖该行为并执行自定义代码。示例代码:

  1. func main() {
  2. app := iris.New()
  3. app.OnErrorCode(iris.StatusNotFound, func(ctx iris.Context) {
  4. ctx.HTML("<b>Resource Not found</b>")
  5. })
  6. app.Get("/", func(ctx iris.Context) {
  7. ctx.ServeFile("./public/index.html", false)
  8. })
  9. app.Get("/profile/{username}", func(ctx iris.Context) {
  10. ctx.Writef("Hello %s", ctx.Params().Get("username"))
  11. })
  12. //提供来自根“/”的文件,如果我们使用.StaticWeb它可以覆盖
  13. //由于下划线需要通配符,所有路由。
  14. //在这里,我们将看到如何绕过这种行为
  15. //通过创建一个新的文件服务器处理程序和
  16. //为路由器设置包装器(如“低级”中间件)
  17. //为了手动检查我们是否想要正常处理路由器
  18. //或者执行文件服务器处理程序。
  19. //使用.StaticHandler
  20. //它与StaticWeb相同,但不是
  21. //注册路由,它只返回处理程序。
  22. fileServer := app.StaticHandler("./public", false, false)
  23. //使用本机net / http处理程序包装路由器。
  24. //如果url不包含任何“。” (即:.css,.js ......)
  25. //(取决于应用程序,您可能需要添加更多文件服务器异常),
  26. //然后处理程序将执行负责的路由器
  27. //注册路线(看“/”和“/ profile / {username}”)
  28. //如果没有,那么它将根据根“/”路径提供文件。
  29. app.WrapRouter(func(w http.ResponseWriter, r *http.Request, router http.HandlerFunc) {
  30. path := r.URL.Path
  31. //请注意,如果path的后缀为“index.html”,则会自动重定向到“/”,
  32. //所以我们的第一个处理程序将被执行。
  33. if !strings.Contains(path, ".") {
  34. //如果它不是资源,那么就像正常情况一样继续使用路由器. <-- IMPORTANT
  35. router(w, r)
  36. return
  37. }
  38. //获取并释放上下文,以便使用它来执行我们的文件服务器
  39. //记得:我们使用net / http.Handler,因为我们在路由器本身之前处于“低级别”。
  40. ctx := app.ContextPool.Acquire(w, r)
  41. fileServer(ctx)
  42. app.ContextPool.Release(ctx)
  43. })
  44. // http://localhost:8080
  45. // http://localhost:8080/index.html
  46. // http://localhost:8080/app.js
  47. // http://localhost:8080/css/main.css
  48. // http://localhost:8080/profile/anyusername
  49. app.Run(iris.Addr(":8080"))
  50. //注意:在这个例子中我们只看到一个用例,
  51. //你可能想要.WrapRouter或.Downgrade以绕过虹膜的默认路由器,即:
  52. //您也可以使用该方法设置自定义代理。
  53. //如果您只想在除root之外的其他路径上提供静态文件
  54. //你可以使用StaticWeb, i.e:
  55. // .StaticWeb("/static", "./public")
  56. // ________________________________requestPath, systemPath
  57. }