为了账号安全,请及时绑定邮箱和手机立即绑定

上下文没有超时

上下文没有超时

Go
MMMHUHU 2022-06-06 14:40:25
我试图使用超时的上下文来退出长时间运行的 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))


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号