我正在使用应用引擎,并从*http.Request
中创建context.Context
(golang.org/x/net/context)变量。
c := appengine.NewContext(r)
我正在传递上下文,并试图找到一种方法来从context.Context
中获取*http.Request
,以便记录http.Request
。
我搜索整个文档,但是没有找到任何解决方法。
我正在使用应用引擎,并从*http.Request
中创建context.Context
(golang.org/x/net/context)变量。
c := appengine.NewContext(r)
我正在传递上下文,并试图找到一种方法来从context.Context
中获取*http.Request
,以便记录http.Request
。
我搜索整个文档,但是没有找到任何解决方法。
appengine.NewContext(r)
返回一个 appengine.Context
类型的值。这与 golang.org/x/net/context
包中的 Context
类型不同!
拥有 appengine.Context
类型的值,你无法获取用于创建它的 *http.Request
。如果你需要 *http.Request
,你必须自己负责传递它(因为你使用它来创建上下文)。
appengine.Context
(它是一个接口类型)有一个方法Context.Request()
,但这仅供内部使用,不会被导出供任何人调用。此外,它返回的是一个interface{}
而不是*http.Request
。即使它返回一个包含*http.Request
的值,您也不能依赖它,因为这个方法可能在未来版本中被更改或删除。*http.Request
与appengine.Context
一起传递是最好的方法。试图从上下文中获取它只是一种“巫术”,并且可能会在新的SDK版本中失败。如果您想简化它,可以创建一个包装器结构体,并传递该包装器代替2个值,例如:type Wrapper struct {
C appengine.Context
R *http.Request
}
还有一个帮助函数:
func CreateCtx(r *http.Request) Wrapper {
return Wrapper{appengine.NewContext(r), r}
}
c.Request()
吗? - Not_a_Golferappengine.NewContext
不是一个golang.org/x/net/context.Context
对象,它有一个请求成员。 - Not_a_Golfer