Golang笔记

goji + Context 例子

goji + Context 例子

context.go 中间件

// framework/middleware/context.go
package middleware

import (
    "net/http"

    "github.com/zenazn/goji/web"
    "golang.org/x/net/context"
)

// ContextKey is key name for stored context
const ContextKey = "context"

// Context creates new Context for new request
func Context(c *web.C, h http.Handler) http.Handler {
    fn := func(w http.ResponseWriter, r *http.Request) {
        ctx := context.Background()
        ctx = context.WithValue(ctx, "request", r)
        c.Env[ContextKey] = ctx
        h.ServeHTTP(w, r)
    }
    return http.HandlerFunc(fn)
}

主程序:

// main.go
package main

import (
    "flag"

    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
    "github.com/zenazn/goji/web/middleware"

    mw "github.com/eure/example-blog-golang/framework/middleware" // <- set alias to avoid name conflict
    "github.com/eure/example-blog-golang/routing"
)

func main() {
    flag.Set("bind", ":1234")

    // api v1 routing
    routeV1 := web.New()
    routeV1.Use(mw.Context) // <- create context
    routeV1.Use(middleware.SubRouter)
    goji.Handle("/api/v1/*", routeV1)
    routing.SetV1(routeV1)

    // run http server
    goji.Serve()
}

context 已保存在 c.Env["context"],建立一个 controller/context.go 文件

// controller/context.go
package controller

import (
    "github.com/zenazn/goji/web"
    "golang.org/x/net/context"

    "github.com/eure/example-blog-golang/framework/middleware"
)

// GetContext returns context
func GetContext(c web.C) context.Context {
    if ctx, ok := c.Env[middleware.ContextKey]; ok {
        return ctx.(context.Context)
    }
    panic("context missing!!")
}

然后可以这么使用:

// controller/apiv1/author_controller.go

func GetAuthor(c web.C, w http.ResponseWriter, r *http.Request) {
    data := controller.NewResponse()
    data.Add("object", "author")
    data.Add("name", c.URLParams["name"])

    ctx := controller.GetContext(c)
    if ctx != nil {
        r2 := ctx.Value("request").(*http.Request)
        data.Add("is_same_request", r == r2)
    }
    controller.RenderJSON(w, data)
}
本文网址: https://golangnote.com/topic/116.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles