上下文未超时

问题描述 投票:0回答:1

我正在尝试将上下文与超时一起使用以退出长时间运行的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
    }

    }
http go settimeout
1个回答
0
投票

总结以下评论的答案:

原始代码存在的问题:req.WithContext(ctx)未在请求中设置上下文,但它返回一个新请求,该请求已对其设置了上下文。

可以通过使用req = req.WithContext(ctx)或使用直接在Client.Do中的返回值(即Client.Do(req.WithContext(ctx)))执行查询的新请求来解决此问题,>

© www.soinside.com 2019 - 2024. All rights reserved.