martini

package main

import "github.com/go-martini/martini"

func main() {
  m := martini.Classic()
  m.Get("/", func() string {
    return "Hello world!"
  })
  m.Run()
}


type ClassicMartini struct { *Martini Router }

func Classic() *ClassicMartini {
    r := NewRouter()
    m := New()
    m.Use(Logger())
    m.Use(Recovery())
    m.Use(Static("public"))
    m.MapTo(r, (*Routes)(nil))
    m.Action(r.Handle)
    return &ClassicMartini{m, r}
}
ClassicMartini 实现了Martini和Router接口, Martini对象通过ServerHttp每次请求来了,createContext,运行context.run(),这个方法里遍历运行各个martini 的handlers,最后运行 martini的action 函数,而这个action 被设置成Router的Handle函数,因此Router的Handle函数会成为每个请求的路由路口,同时router也有个相应的routecontext。
Recover handler就是运行了一个defer函数。 里面还有defaultReturnHandler,这个在routecontext.run()函数里被调用,每次调用一个route handler,如果有返回,就会通过它写入responsewriter。一旦检测到有写出status就终止后面的routehandler?





例子:
package main

import (
        "fmt"
        "strings"
        "io/ioutil"
        "net/http"
        "github.com/go-martini/martini"
        "github.com/martini-contrib/auth"
)

func main() {
        m := martini.Classic()
        m.Use(auth.BasicFunc(func(name, pass string) bool{
                fmt.Println(name, pass)
                return auth.SecureCompare(name, "admin") && auth.SecureCompare(pass, "guessme")
        }))

        m.Get("/v2/:name/:tsd", func(params martini.Params) string{
                return "Hello " + params["name"] + " " + params["tsd"]
        })

        m.Get("/v2/sb/**", func(params martini.Params)(int, string){
                return 200, "what are you gan sha ne"
        })

        m.Get("/req/header", func(params martini.Params, req *http.Request, w http.ResponseWriter) {
                req.Header.Write(w)
        })

        m.Put("/req/body", func(params martini.Params, req *http.Request) string {
                body, _ := ioutil.ReadAll(req.Body)
                return string(body)
        })

        m.Get("/req/url", func(req *http.Request) string {
                ps := req.URL.Query()
                r := ""
                for k,v := range ps {
                        r = r + k + ":" + strings.Join(v, ",")  + "\n"
                }
                return r
        })

        m.RunOnAddr(":3721")
}

 

posted on 2015-09-21 15:45  不忘初衷,方能致远  阅读(462)  评论(0)    收藏  举报

导航