package main
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
const (
TraceIdName = "trace-id"
)
func main() {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(func(r *ghttp.Request) {
ctx := context.WithValue(r.Context(), TraceIdName, "HBm876TFCde435Tgf")
r.SetCtx(ctx)
r.Middleware.Next()
})
group.ALL("/", func(r *ghttp.Request) {
r.Response.Write(r.Context().Value(TraceIdName))
// 也可以使用
// r.Response.Write(r.GetCtxVar(TraceIdName))
})
})
s.SetPort(8199)
s.Run()
}
8 Comments
sanrentai
示例2,
SetCtx
这个方法是在哪个版本加的? 我用
v1.14.6
报错另外问一下,用示例1 的
SetCtxVar
取值时可以用r.Context().Value(TraceIdName)
吗?这个编辑器挺有意思,复制的文字会带上颜色格式。
可以用工具栏清除格式
郭强
你好,这个是最新版本的新功能,目前在
master
分支上。该空间的文档是最新版本的,旧版本的文档请查看空间快捷连接:支持啊,
Value
方法是标准库context
的方法。sanrentai
angelandy
有个东西反馈一下,不知道是不是bug
调用 Context() 会导致 ctx 会变
先贴代码
打印出来的结果是下面
1、context.Background.WithValue(type trace.traceContextKeyType, val <not Stringer>).WithValue(type string, val <not Stringer>).WithValue(type gctx.StrKey, val <not Stringer>).WithValue(type trace.traceContextKeyType, val <not Stringer>)
2、&{%!t(*context.valueCtx=&{0xc0003b2ae0 MiddlewareServerTracingHandled 1}) %!t(trace.traceContextKeyType=0) %!t(*trace.recordingSpan=&{{0 0} {[240 89 112 9 107 214 31 23 5 184 251 47 100 154 67 151] [49 4 156 121 115 9 55 194] 1 {[]} false} 2 /user/info {13892617968244255516 5663679801 0x10ebd80} {0 0 <nil>} {0 } 0 {[240 89 112 9 107 214 31 23 5 184 251 47 100 154 67 151] [217 5 156 121 160 170 13 178] 1 {[]} false} [{hostname {4 0 DESKTOP-005IF25-wsl <nil>}} {ip.intranet {4 0 172.21.5.116,172.17.0.1 <nil>}} {host.name {4 0 DESKTOP-005IF25-wsl <nil>}}] 0 {[] 128 0} {[] 128 0} <nil> 0xc000356200})}
3、*context.valueCtx
4、0xc0002fa780
1、context.Background.WithValue(type trace.traceContextKeyType, val <not Stringer>).WithValue(type string, val <not Stringer>).WithValue(type gctx.StrKey, val <not Stringer>).WithValue(type trace.traceContextKeyType, val <not Stringer>).WithValue(type string, val aaaaaaaaaaaaaa)
2、&{%!t(*context.valueCtx=&{0xc0003b2d80 0 0xc000490480}) %!t(string=token) %!t(string=aaaaaaaaaaaaaa)}
3、*context.valueCtx
4、0xc0003b30e0
在上面 SetCtxVar 后,ctx 并没有 token=aaaaaaaaaa 的值
r.Context() 后,ctx 就有了
应该是SetCtxVar 后,r 的 context 是重新设了,保存在 r.context
这时候 r.context 和ctx 是不一样的。token 保存在 r.context 里
应该是在 中间件调用 controller 方法的时候 r.context 是空的,但是传过来的 ctx 是绑定了 r 的
所以就产生了这种现象
harbor
简而言之,ctx的传递都是值传递
gcf
controller中的ctx如何获取
对象呢?
糖水不加糖
g.RequestFromCtx
wilson
g.RequestFromCtx(ctx) 这个就是返回的 *ghttp.Request
Before80
“请求流程往往会在上下文中共享一些自定义设置的变量,例如在请求开始之前通过中间件设置一些变量,随后在路由服务方法中可以获取该变量并相应对一些处理。”
中的“并相应对一些处理”
应修改成:
“并相应做一些处理”。