我试图使用超时的上下文来退出长时间运行的 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 } }
1 回答

富国沪深
TA贡献1790条经验 获得超9个赞
总结以下评论中的答案:
原始代码的问题:req.WithContext(ctx)
没有根据请求设置上下文,但它返回一个新请求,该请求上设置了上下文。
可以使用新请求来解决该问题req = req.WithContext(ctx)
,使用或者直接使用返回值Client.Do
来执行查询Client.Do(req.WithContext(ctx))
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报
0/150
提交
取消