iris MVC hello world示例

目录结构

主目录helloWorld

  1. —— main.go
  2. —— main_test.go

代码示例

文件名称 main.go

  1. package main
  2. import (
  3. "github.com/kataras/iris"
  4. "github.com/kataras/iris/mvc"
  5. "github.com/kataras/iris/middleware/logger"
  6. "github.com/kataras/iris/middleware/recover"
  7. )
  8. //这个例子相当于
  9. // /hello-world/main.go
  10. //似乎是你的附加代码,必须写不值得但请记住,这个例子
  11. //没有使用像iris mvc这样的功能
  12. //Model,Persistence或View引擎,也不是Session,
  13. //这对于学习目的来说非常简单,可能你永远不会用到这样的,作为应用程序中任何位置的简单控制器
  14. //我们在这个示例中使用MVC
  15. //在提供JSON的“/ hello”路径上
  16. //在我的个人笔记本电脑上每20MB吞吐量大约2MB,
  17. //它可以接受大多数应用程序,但你可以选择
  18. //最适合你的是Iris,低级处理程序:性能
  19. //或高级控制器:在大型应用程序上更易于维护和更小的代码库。
  20. //当然你可以将所有这些都放到主函数中,它只是一个单独的函数
  21. //用于main_test.go。
  22. func newApp() *iris.Application {
  23. app := iris.New()
  24. //(可选)添加两个内置处理程序
  25. //可以从任何与http相关的panics中恢复
  26. //并将请求记录到终端。
  27. app.Use(recover.New())
  28. app.Use(logger.New())
  29. //控制器根路由路径"/"
  30. mvc.New(app).Handle(new(ExampleController))
  31. return app
  32. }
  33. func main() {
  34. app := newApp()
  35. // http://localhost:8080
  36. // http://localhost:8080/ping
  37. // http://localhost:8080/hello
  38. // http://localhost:8080/custom_path
  39. app.Run(iris.Addr(":8080"))
  40. }
  41. // ExampleController提供 ”/”,“/ping”和 “/hello”路由选项
  42. type ExampleController struct{}
  43. // Get 服务
  44. // 请求方法: GET
  45. // 请求资源路径: http://localhost:8080
  46. func (c *ExampleController) Get() mvc.Result {
  47. return mvc.Response{
  48. ContentType: "text/html",
  49. Text: "<h1>Welcome</h1>",
  50. }
  51. }
  52. // GetPing 服务
  53. // 请求方法: GET
  54. // 请求资源路径: http://localhost:8080/ping
  55. func (c *ExampleController) GetPing() string {
  56. return "pong"
  57. }
  58. // GetHello 服务
  59. // 请求方法: GET
  60. // 请求资源路径: http://localhost:8080/hello
  61. func (c *ExampleController) GetHello() interface{} {
  62. return map[string]string{"message": "Hello Iris!"}
  63. }
  64. //在main函数调用controller之前调用一次BeforeActivation
  65. //在版本9之后,您还可以为特定控制器的方法添加自定义路由
  66. //在这里您可以注册自定义方法的处理程序
  67. //使用带有`ca.Router`的标准路由器做一些你可以做的事情即使不是mvc
  68. //并添加将绑定到控制器的字段或方法函数的输入参数的依赖项
  69. func (c *ExampleController) BeforeActivation(b mvc.BeforeActivation) {
  70. anyMiddlewareHere := func(ctx iris.Context) {
  71. ctx.Application().Logger().Warnf("Inside /custom_path")
  72. ctx.Next()
  73. }
  74. b.Handle("GET", "/custom_path", "CustomHandlerWithoutFollowingTheNamingGuide", anyMiddlewareHere)
  75. //甚至添加基于此控制器路由的全局中间件,
  76. //在这个例子中是根“/”:
  77. // b.Router().Use(myMiddleware)
  78. }
  79. // CustomHandlerWithoutFollowingTheNamingGuide 服务
  80. // 请求方法: GET
  81. // 请求资源路径: http://localhost:8080/custom_path
  82. func (c *ExampleController) CustomHandlerWithoutFollowingTheNamingGuide() string {
  83. return "hello from the custom handler without following the naming guide"
  84. }
  85. // GetUserBy 服务
  86. // 请求方法: GET
  87. // 请求资源路径: http://localhost:8080/user/{username:string}
  88. //是一个保留的关键字来告诉框架你要在函数的输入参数中绑定路径参数,
  89. //在同一控制器中使用“Get”和“GetBy”可以实现
  90. //
  91. //func (c *ExampleController) GetUserBy(username string) mvc.Result {
  92. // return mvc.View{
  93. // Name: "user/username.html",
  94. // Data: username,
  95. // }
  96. // }
  97. /*
  98. func (c *ExampleController) Post() {}
  99. func (c *ExampleController) Put() {}
  100. func (c *ExampleController) Delete() {}
  101. func (c *ExampleController) Connect() {}
  102. func (c *ExampleController) Head() {}
  103. func (c *ExampleController) Patch() {}
  104. func (c *ExampleController) Options() {}
  105. func (c *ExampleController) Trace() {}
  106. */
  107. /*
  108. func (c *ExampleController) All() {}
  109. // 或者
  110. func (c *ExampleController) Any() {}
  111. func (c *ExampleController) BeforeActivation(b mvc.BeforeActivation) {
  112. // 1 -> http 请求方法
  113. // 2 -> 请求路由
  114. // 3 -> 此控制器的方法名称应该是该路由的处理程序
  115. b.Handle("GET", "/mypath/{param}", "DoIt", optionalMiddlewareHere...)
  116. }
  117. //AfterActivation,所有依赖项都被设置,因此访问它们是只读
  118. ,但仍可以添加自定义控制器或简单的标准处理程序。
  119. func (c *ExampleController) AfterActivation(a mvc.AfterActivation) {}
  120. */

main_test.go

  1. package main
  2. import (
  3. "testing"
  4. "github.com/kataras/iris/httptest"
  5. )
  6. func TestMVCHelloWorld(t *testing.T) {
  7. e := httptest.New(t, newApp())
  8. e.GET("/").Expect().Status(httptest.StatusOK).
  9. ContentType("text/html", "utf-8").Body().Equal("<h1>Welcome</h1>")
  10. e.GET("/ping").Expect().Status(httptest.StatusOK).
  11. Body().Equal("pong")
  12. e.GET("/hello").Expect().Status(httptest.StatusOK).
  13. JSON().Object().Value("message").Equal("Hello Iris!")
  14. e.GET("/custom_path").Expect().Status(httptest.StatusOK).
  15. Body().Equal("hello from the custom handler without following the naming guide")
  16. }