http - Go http 客户端超时与上下文超时

标签 http go go-http

在 http.Client 中设置的超时和在请求上下文中设置的超时有什么区别?
我见过 2 种在 http 客户端设置超时的方法。
第一的:

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8080", nil)
第二:
client := http.Client{
    Timeout: 2 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
    panic(err)
}
什么时候使用一个?

最佳答案

两者都可以实现相同的事情,即由于超时而终止请求。
但是使用上下文是首选方式,因为它是为这项任务而设计的。字段 timeout 在上下文添加到 Go 之前存在。您必须在创建请求时选择一个超时时间,因为请求将选择要应用的较小超时时间,从而使其他时间变得无用。在这种情况下,最好的方法是使用上下文超时,因为您可以更好地控制它,如果您想通过逻辑决策取消请求,则可以使用取消而不指定超时。使用上下文,您还可以通过它传递任何值来描述请求范围值。
使用上下文是特定于请求的,而使用客户端超时可能适用于所有传递给 Do 的请求。方法客户有。如果您想将截止日期/超时专门用于每个请求,请使用上下文,否则如果您希望每个出站请求有 1 个超时,那么使用客户端超时就足够了。
你也可以在这里阅读 Specify timeout when tracing HTTP request in Go

关于http - Go http 客户端超时与上下文超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64129364/

相关文章:

php - 在 PHP 中获取原始 HTTP 请求正文的可靠方法

Golang 循环遍历视频帧和像素?

go - 带有 http.SetCookie 的无效内存地址

http - 使用 http 劫持者有什么好处

android - native 库没有从 golang 条件实现加载到 apex_defaults?

go - net.Listen 和 http.ListenAndServe 功能的区别

javascript - 如何正确设计后端结构来处理消息服务?

javascript - React Native "fetch"返回服务器响应但没有信息

python - 在 Django 1.3 中读取原始 HTTP 请求

go - 将时间字符串类型解析回时间类型错误