上下文没有超时

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

    }


    }


MMMHUHU
浏览 213回答 1
1回答

富国沪深

总结以下评论中的答案:原始代码的问题:req.WithContext(ctx)没有根据请求设置上下文,但它返回一个新请求,该请求上设置了上下文。可以使用新请求来解决该问题req = req.WithContext(ctx),使用或者直接使用返回值Client.Do来执行查询Client.Do(req.WithContext(ctx))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go