我正在尝试将上下文与超时一起使用以退出长时间运行的http GET请求。对url的请求应花费10秒钟以上,但2秒钟后我的请求不会超时。问题是什么?传递给makeGet()函数的ctx来自http handlefun r.Contex()。
makeGet(ctx context.Context, url string, respBuffer *bytes.Buffer) (int, error){
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return 0, err
}
//
ctx, cancel := context.WithTimeout(ctx, time.Second*2)
defer cancel()
req.WithContext(ctx)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return 0, err
}
defer resp.Body.Close()
_, err = respBuffer.ReadFrom(resp.Body)
if err != nil {
return resp.StatusCode, err
}
}
总结以下评论的答案:
原始代码存在的问题:req.WithContext(ctx)
未在请求中设置上下文,但它返回一个新请求,该请求已对其设置了上下文。
可以通过使用req = req.WithContext(ctx)
或使用直接在Client.Do
中的返回值(即Client.Do(req.WithContext(ctx))
)执行查询的新请求来解决此问题,>