Go iris框架的路由绑定有两种模式,一种就是函数式、另外一种就是MVC模式,函数式就是给指定URL路径绑定一个处理函数,MVC模式就是给URL路径绑定一个控制器,框架根据控制器方法的命名规则自动生成对应的URL路径,同时自动绑定对应的控制器函数。
函数式路由绑定
iris框架最简单的路由模型,给任意URL绑定一个函数即可
func main() {
// 创建一个带有默认中间件的iris应用程序:
// 默认使用“debug”日志级别。
// 支持位于“./locales”目录下的本地化。
// HTML模板位于“./views”或“./templates”目录下。
// 访问日志保存在“./access.log”中,
// 同时已经附加了恢复(无崩溃)和请求ID中间件。
app := iris.Default()
// 根据http请求方法和路径,绑定路由函数即可,跟Gin、echo等框架的路由机制类似。
app.Get("/someGet", getting)
app.Post("/somePost", posting)
app.Put("/somePut", putting)
app.Delete("/someDelete", deleting)
app.Patch("/somePatch", patching)
app.Header("/someHead", head)
app.Options("/someOptions", options)
// 监听端口
app.Listen(":8080")
}
路径中的参数
func main() {
app := iris.Default()
// 这个处理器将匹配 /user/john 但不匹配 /user/ 或 /user
app.Get("/user/{name}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
ctx.Writef("Hello %s", name)
})
// 然而,这个处理器将匹配 /user/john/ 和 /user/john/send
// 如果没有其他路由匹配 /user/john,它将重定向到 /user/john/
app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
name := ctx.Params().Get("name")
action := ctx.Params().Get("action")
message := name + "是" + action
ctx.WriteString(message)
})
// 对于每个匹配的请求,Context 将保存路由定义
app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // true
})
app.Listen(":8080")
}
可用的内置参数类型:
参数类型 | Go 类型 | 验证条件 | 获取方法 |
---|---|---|---|
:string |
string | 任何字符(单个路径段) | Params().Get |
:uuid |
string | uuidv4 或 v1 格式(单个路径段) | Params().Get |
:int |
int | -9223372036854775808 到 9223372036854775807(x64)或 -2147483648 到 2147483647(x32),取决于主机体系结构 | Params().GetInt |
:int8 |
int8 | -128 到 127 | Params().GetInt8 |
:int16 |
int16 | -32768 到 32767 | Params().GetInt16 |
:int32 |
int32 | -2147483648 到 2147483647 | Params().GetInt32 |
:int64 |
int64 | -9223372036854775808 到 9223372036854775807 | Params().GetInt64 |
:uint |
uint | 0 到 18446744073709551615(x64)或 0 到 4294967295(x32),取决于主机体系结构 | Params().GetUint |
:uint8 |
uint8 | 0 到 255 | Params().GetUint8 |
:uint16 |
uint16 | 0 到 65535 | Params().GetUint16 |
:uint32 |
uint32 | 0 到 4294967295 | Params().GetUint32 |
:uint64 |
uint64 | 0 到 18446744073709551615 | Params().GetUint64 |
:bool |
bool | “1” 或 “t” 或 “T” 或 “TRUE” 或 “true” 或 “True” 或 “0” 或 “f” 或 “F” 或 “FALSE” 或 “false” 或 “False” | Params().GetBool |
:alphabetical |
string | 小写或大写字母 | Params().Get |
:file |
string | 小写或大写字母、数字、下划线(_)、破折号(-)、点(.),不能包含空格或其他文件名无效的特殊字符 | Params().Get |
:path |
string | 任意字符,可以由斜杠(路径段)分隔,但应为路由路径的最后一部分 | Params().Get |
:mail |
string | 电子邮件,不验证域 | Params().Get |
:email |
string | 电子邮件,验证域 | Params().Get |
:date |
string | yyyy/mm/dd 格式,例如 /blog/{param:date} 匹配 /blog/2022/04/21 | Params().GetTime 和 Params().SimpleDate |
:weekday |
uint (0-6) 或 string | string 格式为 time.Weekday 的长名称(”sunday” 到 “monday” 或 “Sunday” 到 “Monday”),例如 /schedule/{param:weekday} 匹配 /schedule/monday | Params().GetWeekday |
分组路由
有时候需要做API版本管理,或者为一个大模块的路由设置统一的前缀,这个时候就用到了路由分组能力。
func main() {
app := iris.Default()
// 简单分组: v1
v1 := app.Party("/v1")
{
v1.Post("/login", loginEndpoint)
v1.Post("/submit", submitEndpoint)
v1.Post("/read", readEndpoint)
}
// 简单分组: v2
v2 := app.Party("/v2")
{
v2.Post("/login", loginEndpoint)
v2.Post("/submit", submitEndpoint)
v2.Post("/read", readEndpoint)
}
app.Listen(":8080")
}
MVC路由
Go iris框架支持MVC架构,通过一定的规则将路由映射到指定的控制器函数中。
package main
import (
"strings"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/middleware/logger"
"github.com/kataras/iris/v12/middleware/recover"
"github.com/kataras/iris/v12/mvc"
)
// 创建iris应用
func newApp() *iris.Application {
app := iris.New()
// 设置两个中间件
// recover用于拦截panic错误,避免程序异常退出
// logger 用于记录请求日志
app.Use(recover.New())
app.Use(logger.New())
// 这里将控制器注册到 "/" 跟路由.
mvc.New(app).Handle(new(ExampleController))
// 也可以借助路由组注册到指定路径下面
// 例子: 控制器注册到/books路径下面
// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}
func main() {
// 创建应用
app := newApp()
// http://localhost:8080
// http://localhost:8080/ping
// http://localhost:8080/hello
// http://localhost:8080/custom_path
app.Listen(":8080")
}
// 定义ExampleController 控制器,处理下面几个路径请求 "/", "/ping" and "/hello".
type ExampleController struct{}
// 处理GET请求
// 请求地址: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
return mvc.Response{
ContentType: "text/html",
Text: "<h1>Welcome</h1>",
}
}
// GetPing serves
// Method: GET
// 请求地址: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
return "pong"
}
// GetHello serves
// Method: GET
// 请求地址: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
return map[string]string{"message": "Hello Iris!"}
}
// GetHelloWorld serves
// Method: GET
// 请求地址: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
return map[string]string{"message": "Hello Iris! DefaultPath"}
}
MVC的路由跟控制函数命名规则的关系。
路由地址:路由分组 + Http方法名 + 函数单词(小写)
例如:
func (c *ExampleController) GetPing() string {
return "pong"
}
因为没有设置路由分组,这个函数能够处理http://localhost:8080/ping 路由的GET请求