Macaron 核心概念

    下面是 macaron.Classic 已经包含的功能:

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

    处理器是 Macaron 的灵魂和核心所在. 一个处理器基本上可以是任何的函数:

    1. m.Get("/", func() string {
    2. return "hello world"
    3. })

    如果想要将同一个函数作用于多个路由,则可以使用一个命名函数:

    1. m.Get("/", myHandler)
    2. m.Get("/hello", myHandler)
    3. func myHandler() string {
    4. return "hello world"
    5. }

    当一个处理器返回结果的时候, Macaron 将会把返回值作为字符串写入到当前的 里面:

    1. m.Get("/", func() string {
    2. return "hello world" // HTTP 200 : "hello world"
    3. m.Get("/", func() *string {
    4. str := "hello world"
    5. return &str // HTTP 200 : "hello world"
    6. })
    7. m.Get("/", func() []byte {
    8. return []byte("hello world") // HTTP 200 : "hello world"
    9. })
    10. m.Get("/", func() error {
    11. // 返回 nil 则什么都不会发生
    12. return nil
    13. }, func() error {
    14. // ... 得到了错误
    15. return err // HTTP 500 : <错误消息>
    16. })

    另外你也可以选择性的返回状态码(仅适用于 string[]byte 类型):

    1. m.Get("/", func() (int, string) {
    2. return 418, "i'm a teapot" // HTTP 418 : "i'm a teapot"
    3. })
    4. m.Get("/", func() (int, *string) {
    5. return 418, &str // HTTP 418 : "i'm a teapot"
    6. })
    7. m.Get("/", func() (int, []byte) {
    8. })

    处理器是通过反射来调用的,Macaron 通过 依赖注入 来为处理器注入参数列表。 这样使得 Macaron 与 Go 语言的 接口完全兼容

    如果你加入一个参数到你的处理器, Macaron 将会搜索它参数列表中的服务,并且通过类型判断来解决依赖关系:

    1. m.Get("/", func(ctx *macaron.Context) {
    2. ctx.Resp.WriteHeader(200) // HTTP 200
    3. })

    下面的这些服务已经被包含在经典 Macaron 中(macaron.Classic):

    中间件处理器是工作于请求和路由之间的。本质上来说和 Macaron 其他的处理器没有分别. 您可以使用如下方法来添加一个中间件处理器到队列中:

    1. m.Use(func() {
    2. // 处理中间件事务
    3. })

    你可以通过 Handlers 函数对中间件队列实现完全的控制. 它将会替换掉之前的任何设置过的处理器:

    中间件处理器可以非常好处理一些功能,包括日志记录、授权认证、会话(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. })