上下文没有超时

context not timing out

我正在尝试使用超时上下文来退出长 运行 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) 没有根据请求设置上下文,但是,它 return 是一个设置了上下文的新请求。

可以使用 req = req.WithContext(ctx) 或直接在 Client.Do 中使用 return 值(即 Client.Do(req.WithContext(ctx))[=14)执行查询来解决此问题=]