当我提出一个带有上下文的请求时
req, err := http.NewRequestWithContext(ctx, method, url, payload)
然后,如果我检查服务中的上下文,我可以看到我发送的上下文。例如,在一个使用gin gonic框架的API中,我使用以下命令获得我发送的上下文:
c.Request.Context()
但是,在使用echo/v4的API中,如果我使用
c.Request().Context()
我得到了一个上下文,但它不是我发送的上下文。
我期待在上下文中获得我已经发送了一个echo API。
我加了这张图片,这是我发送的ctx。
Context I sent
当我在接收上下文的第二个服务中检查ctxt时,我使用gin得到了上下文:
In Gin API
然而,我得到的回应是:
In Echo API
1条答案
按热度按时间oug3syen1#
我无法解释为什么gin看到的上下文看起来像您发送的上下文,但是您对
http.Request.ctx
(http.Request.Context()
返回的内容)的期望是不正确的。如果您想在HTTP客户机和服务器之间传递额外的信息,您必须使用HTTP支持的机制来完成此操作,即请求主体、请求参数、和请求头。gin和echo甚至都有自己的内部Context
类型,用于在调用堆栈中携带信息,这只会让事情变得更加混乱。如果查看the library code which actually writes out the http request,您会发现它没有使用golang
context.Context
的键/值功能。它实际上似乎只用于here,其中
RoundTripper
检查请求的上下文是否在完成之前超时,在这种情况下(正如人们所预料的那样)将返回一个错误。因此,我认为您需要重新调整您对HTTP中的请求上下文的期望,并使用支持的机制之一来传递您需要传递的任何内容。