核心概念

经典 Macaron

为了更快速的启用 Macaron,macaron.Classic 提供了一些默认的组件以方便 Web 开发:
1
m := macaron.Classic()
2
// ... 可以在这里使用中间件和注册路由
3
m.Run()
Copied!
下面是 macaron.Classic 已经包含的功能:

Macaron 实例

任何类型为 macaron.Macaron 的对象都可以被认为是 Macaron 的实例,您可以在单个程序中使用任意数量的 Macaron 实例。

处理器

处理器是 Macaron 的灵魂和核心所在. 一个处理器基本上可以是任何的函数:
1
m.Get("/", func() string {
2
return "hello world"
3
})
Copied!
如果想要将同一个函数作用于多个路由,则可以使用一个命名函数:
1
m.Get("/", myHandler)
2
m.Get("/hello", myHandler)
3
4
func myHandler() string {
5
return "hello world"
6
}
Copied!
除此之外,同一个路由还可以注册任意多个处理器:
1
m.Get("/", myHandler1, myHandler2)
2
3
func myHandler1() {
4
// ... 处理内容
5
}
6
7
func myHandler2() string {
8
return "hello world"
9
}
Copied!

返回值

当一个处理器返回结果的时候, Macaron 将会把返回值作为字符串写入到当前的 http.ResponseWriter 里面:
1
m.Get("/", func() string {
2
return "hello world" // HTTP 200 : "hello world"
3
})
4
5
m.Get("/", func() *string {
6
str := "hello world"
7
return &str // HTTP 200 : "hello world"
8
})
9
10
m.Get("/", func() []byte {
11
return []byte("hello world") // HTTP 200 : "hello world"
12
})
13
14
m.Get("/", func() error {
15
// 返回 nil 则什么都不会发生
16
return nil
17
}, func() error {
18
// ... 得到了错误
19
return err // HTTP 500 : <错误消息>
20
})
Copied!
另外你也可以选择性的返回状态码(仅适用于 string[]byte 类型):
1
m.Get("/", func() (int, string) {
2
return 418, "i'm a teapot" // HTTP 418 : "i'm a teapot"
3
})
4
5
m.Get("/", func() (int, *string) {
6
str := "i'm a teapot"
7
return 418, &str // HTTP 418 : "i'm a teapot"
8
})
9
10
m.Get("/", func() (int, []byte) {
11
return 418, []byte("i'm a teapot") // HTTP 418 : "i'm a teapot"
12
})
Copied!

服务注入

处理器是通过反射来调用的,Macaron 通过 依赖注入 来为处理器注入参数列表。 这样使得 Macaron 与 Go 语言的 http.HandlerFunc 接口完全兼容
如果你加入一个参数到你的处理器, Macaron 将会搜索它参数列表中的服务,并且通过类型判断来解决依赖关系:
1
m.Get("/", func(resp http.ResponseWriter, req *http.Request) {
2
// resp 和 req 是由 Macaron 默认注入的服务
3
resp.WriteHeader(200) // HTTP 200
4
})
Copied!
在您的代码中最常用的服务应该是 *macaron.Context
1
m.Get("/", func(ctx *macaron.Context) {
2
ctx.Resp.WriteHeader(200) // HTTP 200
3
})
Copied!
下面的这些服务已经被包含在经典 Macaron 中(macaron.Classic):

中间件机制

中间件处理器是工作于请求和路由之间的。本质上来说和 Macaron 其他的处理器没有分别. 您可以使用如下方法来添加一个中间件处理器到队列中:
1
m.Use(func() {
2
// 处理中间件事务
3
})
Copied!
你可以通过 Handlers 函数对中间件队列实现完全的控制. 它将会替换掉之前的任何设置过的处理器:
1
m.Handlers(
2
Middleware1,
3
Middleware2,
4
Middleware3,
5
)
Copied!
中间件处理器可以非常好处理一些功能,包括日志记录、授权认证、会话(sessions)处理、错误反馈等其他任何需要在发生在 HTTP 请求之前或者之后的操作:
1
// 验证一个 API 密钥
2
m.Use(func(ctx *macaron.Context) {
3
if ctx.Req.Header.Get("X-API-KEY") != "secret123" {
4
ctx.Resp.WriteHeader(http.StatusUnauthorized)
5
}
6
})
Copied!

Macaron 环境变量

一些 Macaron 处理器依赖 macaron.Env 全局变量为开发模式和部署模式表现出不同的行为,不过更建议使用环境变量 MACARON_ENV=production 来指示当前的模式为部署模式。

处理器工作流

Last modified 1yr ago