在我的go应用程序中,我收到以下错误:" http:server closed idle connection"。如果遇到的话,我想抓住它并重试我的http连接。
我发现此错误来自" net / http"包装以及运输实施。特别是它定义了here
我把它包裹在url.Error
中,但这是我能够找到的全部内容。你知道我怎么能真正发现这个错误吗?
编辑:
我正在使用elastic search client,而https://gleam.io/stuart-test正在使用net/http
。从客户端我得到上面提到的错误,并想重新我的弹性搜索请求是暂时的。目前,我捕捉瞬态错误的方式是:
if urlErr, ok := err.(*url.Error); ok && (urlErr.Temporary() || urlErr.Err == io.EOF) {
return retryRequest()
}
答案 0 :(得分:1)
self.delegate.passSliderValue()
中的评论说明(位于here):
net/http/transport.go
Go会在找到非零if err == errServerClosedIdle {
// The server replied with io.EOF while we were trying to
// read the response. Probably an unfortunately keep-alive
// timeout, just as the client was writing a request.
return true
}
(找到here)时尝试重试该请求,因此我认为应该重试该请求(或提供http.Request.GetBody
功能)。
至于导致错误原因,您可能想检查服务器的保持活动功能,我的猜测是服务器过早地发送TCP连接重置(解释为GetBody
)。您可能想尝试禁用keep-alives并查看是否会发生任何变化。
答案 1 :(得分:1)
正如Gray Fox所说,Go通常会重试这些请求。但是,对于不是“幂等”的请求,情况并非如此。我在POST
请求中遇到了一些此类错误,经过搜索后发现this Github issue上写着:
HTTP传输通常会重试这些请求,但是由于它们是POST请求,因此它们不是幂等的,并且Go保守地认为重试它们可能是不安全的。
此问题之后,有人提到许多银行API使用Idempotent-Key
标头的某些变体来使其“安全”。 Stripe是使用该标头的公司,这就是their API docs这样说的:
API支持幂等性,可以安全地重试请求,而不会意外执行两次相同的操作。
那么您就可以使用标题了。
简而言之,如果您想让Go的HTTP传输重试POST请求(以及其他非幂等请求),则需要包含Idempotency-Key
或X-Idempotency-Key
标头。不一定使这些请求成为幂等,但从net/http
的角度来看,这将使它们可重试。
链接: