登录
首页 >  Golang >  Go问答

获取入站请求后的上下文:具体步骤

来源:stackoverflow

时间:2024-03-24 12:12:37 471浏览 收藏

本文探讨了在 Net/HTTP 请求处理结束后获取请求上下文的方法。文档指出,请求上下文会在连接关闭、请求取消或 ServeHTTP 方法返回时被取消。因此,作者询问了在 ServeHTTP 返回后保留上下文链值以完成与请求相关工作的正确做法。

问题内容

摘自 net/http 包中 func (r *Request) Context() context.Context 的文档:

对于传入服务器请求,当客户端连接关闭、请求被取消(使用 HTTP/2)或 ServeHTTP 方法返回时,上下文将被取消。

如果我想在 ServeHTTP 方法返回后完成与请求相关的工作(例如发出通知),正确的做法是什么?我想在值方面保留上下文链,但简单地将上述方法最初返回的上下文传递给消息队列提交 API 是行不通的,因为上下文可能会在完成之前被取消。

是否有一种简单的方法可以在没有截止日期或取消的情况下导出上下文链中的值?我可以手动复制我拥有键的值,但依赖上下文连续性的其他内容(例如跟踪)将不存在。

预先感谢您的回答。


解决方案


是否有一种简单的方法来导出值?

开箱即用,不。我可以想象两种可能性:

  1. 您可以创建一个自定义上下文,以吞下/忽略取消。这种类型需要 Done()Err() 的自定义实现,它们检测到超时/取消并忽略它。

    这种方法可能有一个缺点,即您可能会引用预计在请求结束时超出范围的值。这可能会导致竞争条件或其他数据完整性问题。

    我建议不要使用这种方法,尽管它可能最接近您所要求的方法。上下文应该主要用于取消,因此在上下文中大量使用值是一种反模式。

  2. 您在问题中回避的更安全、更简单的解决方案可能是将您仍然关心的任何值显式复制到使用 context.Background() 创建的新上下文中。

以上就是《获取入站请求后的上下文:具体步骤》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>