从AppEngine上的Context获取*http.Request

3

我正在使用应用引擎,并从*http.Request中创建context.Context(golang.org/x/net/context)变量。

    c := appengine.NewContext(r)

我正在传递上下文,并试图找到一种方法来从context.Context中获取*http.Request,以便记录http.Request

我搜索整个文档,但是没有找到任何解决方法。


你尝试过 c.Request() 吗? - Not_a_Golfer
@Not_a_Golfer golang.org/x/net/context 中不包含 Request。 - MIkCode
1
正如 @icza 所提到的,appengine.NewContext 不是一个 golang.org/x/net/context.Context 对象,它有一个请求成员。 - Not_a_Golfer
1个回答

3

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.Requestappengine.Context一起传递是最好的方法。试图从上下文中获取它只是一种“巫术”,并且可能会在新的SDK版本中失败。如果您想简化它,可以创建一个包装器结构体,并传递该包装器代替2个值,例如:
type Wrapper struct {
    C appengine.Context
    R *http.Request
}

还有一个帮助函数:

func CreateCtx(r *http.Request) Wrapper {
    return Wrapper{appengine.NewContext(r), r}
}

除了传递它,获取http请求数据的最佳方式是什么? - MIkCode
1
@MIkCode 传递它是最好的方法,但您可以创建一个包装器来保存这两个值。请参见编辑后的答案。 - icza
我认为使用了golang.org/x/net/context。appengine.go - Koushik Shetty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接