路由 taro Posted on Apr 4 2021 Golang iris # 直接注册 ## hander 方法 ```go app.Handle("GET", "/contact", func(ctx iris.Context) { ctx.HTML("<h1> Hello from /contact </h1>") }) ``` ## method 方法 ``` //GET 方法 app.Get("/", handler) // POST 方法 app.Post("/", handler) // PUT 方法 app.Put("/", handler) // DELETE 方法 app.Delete("/", handler) //OPTIONS 方法 app.Options("/", handler) //TRACE 方法 app.Trace("/", handler) //CONNECT 方法 app.Connect("/", handler) //HEAD 方法 app.Head("/", handler) // PATCH 方法 app.Patch("/", handler) //任意的http请求方法如option等 app.Any("/", handler) func handler(ctx iris.Context){ ctx.Writef("Hello from method: %s and path: %s", ctx.Method(), ctx.Path()) } ``` # 间接注册 根据控制器函数名自动生成 ```go mvc.New(app).Handle(new(ExampleController)) type ExampleController struct{} // Get 服务 // 请求方法: GET // 请求资源路径: http://localhost:8080 func (c *ExampleController) Get() mvc.Result { return mvc.Response{ ContentType: "text/html", Text: "<h1>Welcome</h1>", } } // GetPing 服务 // 请求方法: GET // 请求资源路径: http://localhost:8080/ping func (c *ExampleController) GetPing() string { return "pong" } //GetUserBy 服务 // 请求方法: GET // 请求资源路径: http://localhost:8080/user/{username:string} //是一个保留的关键字来告诉框架你要在函数的输入参数中绑定路径参数, //在同一控制器中使用“Get”和“GetBy”可以实现 // func (c *ExampleController) GetUserBy(username string) mvc.Result{ return mvc.View{ Name: "user/username.html", Data: username, } } ``` # 分组路由 ## Party 分组 ```go users := app.Party("/users", myAuthMiddlewareHandler) // http://localhost:8080/users/42/profile users.Get("/{id:int}/profile", userProfileHandler) // http://localhost:8080/users/inbox/1 users.Get("/inbox/{id:int}", userMessageHandler) func myAuthMiddlewareHandler(ctx iris.Context){ ctx.WriteString("Authentication failed") } func userProfileHandler(ctx iris.Context) {// id:=ctx.Params().Get("id") ctx.WriteString(id) } func userMessageHandler(ctx iris.Context){ id:=ctx.Params().Get("id") ctx.WriteString(id) } ``` ## 子路由器(Party) ```go app.PartyFunc("/users", func(users iris.Party) { users.Use(myAuthMiddlewareHandler) // http://localhost:8080/users/42/profile users.Get("/{id:int}/profile", userProfileHandler) // http://localhost:8080/users/messages/1 users.Get("/inbox/{id:int}", userMessageHandler) }) func myAuthMiddlewareHandler(ctx iris.Context){ ctx.WriteString("Authentication failed") ctx.Next()//继续执行后续的handler } ``` # 动态路由 ```go app.Get("/username/{name}", func(ctx iris.Context) { ctx.Writef("Hello %s", ctx.Params().Get("name")) }) // {name:string} // http://localhost:8080/profile/id>=1 // 这将抛出404,即使它被发现为路线 : /profile/0, /profile/blabla, /profile/-1 app.Get("/profile/{id:int min(1)}", func(ctx iris.Context) { // 第二个参数是错误的,因为我们使用 macros 它总是为nil // 验证已经发生了. id, _ := ctx.Params().GetInt("id") ctx.Writef("Hello id: %d", id) }) // http://localhost:8080/game/a-zA-Z/level/0-9 //记住,字母只是小写或大写字母。 app.Get("/game/{name:alphabetical}/level/{level:int}", func(ctx iris.Context) { ctx.Writef("name: %s | level: %s", ctx.Params().Get("name"), ctx.Params().Get("level")) }) //让我们使用一个简单的自定义regexp来验证单个路径参数 //它的值只是小写字母。 // http://localhost:8080/lowercase/anylowercase app.Get("/lowercase/{name:string regexp(^[a-z]+)}", func(ctx iris.Context) { ctx.Writef("name should be only lowercase, otherwise this handler will never executed: %s", ctx.Params().Get("name")) }) // http://localhost:8080/single_file/app.js app.Get("/single_file/{myfile:file}", func(ctx iris.Context) { ctx.Writef("file type validates if the parameter value has a form of a file name, got: %s", ctx.Params().Get("myfile")) }) // http://localhost:8080/myfiles/any/directory/here/ // 获取到path app.Get("/myfiles/{directory:path}", func(ctx iris.Context) { ctx.Writef("path type accepts any number of path segments, path after /myfiles/ is: %s", ctx.Params().Get("directory")) }) ``` # 路由命名 # 命名 ```go h := func(ctx iris.Context) { ctx.HTML("<b>Hi</b1>") } // handler registration and naming home := app.Get("/", h) home.Name = "home" // or app.Get("/about", h).Name = "about" app.Get("/page/{id}", h).Name = "page" ``` # 利用 ```html Home: {{ urlpath "home" }} About: {{ urlpath "about" }} Page 17: {{ urlpath "page" "17" }} ``` IRIS(demo) MVC中使用中间件