上下文没有超时
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)执行查询来解决此问题=]
我正在尝试使用超时上下文来退出长 运行 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)执行查询来解决此问题=]