首先检查请求发送阶段的错误,如连接超时、DNS解析失败等;再判断HTTP状态码是否为200或预期范围;设置客户端超时避免阻塞;最后读取响应体时处理可能的传输错误,并始终关闭Body。

在Go语言中处理网络请求返回的错误,关键在于正确使用net/http包并检查多个可能出错的环节。很多开发者只关注HTTP状态码,却忽略了更底层的连接、超时或DNS解析等错误,这会导致程序稳定性下降。
检查请求发送阶段的错误
调用http.Do()或http.Get()等方法时,第一个要判断的是是否成功发出请求。这类错误通常与网络连接有关,比如主机不可达、超时、TLS握手失败等。
示例:
resp, err := http.Get("https://example.com")if err != nil { log.Printf("请求失败: %v", err) // 常见错误类型: // - net.OpError: 连接超时、DNS解析失败 // - *url.Error: URL格式问题或底层连接错误 // - tls.CertificateError: 证书验证失败 return}defer resp.Body.Close()
注意:只要err != nil,就说明请求未成功完成,此时resp可能是nil或部分响应,不能直接使用。
立即学习“go语言免费学习笔记(深入)”;
检查HTTP状态码
即使请求发送成功(无error),服务器仍可能返回非200的状态码,如404、500、401等。这些不属于Go的“错误”,但对业务来说是异常情况。
建议根据实际需求判断状态码:
if resp.StatusCode != http.StatusOK { log.Printf("HTTP错误状态: %d", resp.StatusCode) // 可选择将非200视为错误并处理 return fmt.Errorf("unexpected status: %d", resp.StatusCode)}
也可以接受某些范围的状态码,比如允许2xx和3xx:
if resp.StatusCode >= 400 { return fmt.Errorf("bad response: %d", resp.StatusCode)}
设置超时避免阻塞
默认的http.Client没有超时限制,可能导致请求长时间挂起。应自定义Client并设置合理的超时时间。
client := &http.Client{ Timeout: 10 * time.Second, // 整个请求的最大耗时}resp, err := client.Get("https://www.php.cn/link/c071c86446066d4de2ba1551614a08c8")if err != nil {log.Printf("请求超时或失败: %v", err)return}
更精细的控制可以使用Transport设置连接、读写等阶段的超时:
client := &http.Client{ Transport: &http.Transport{ DialContext: (&net.Dialer{ Timeout: 5 * time.Second, KeepAlive: 30 * time.Second, }).DialContext, TLSHandshakeTimeout: 5 * time.Second, ResponseHeaderTimeout: 5 * time.Second, ExpectContinueTimeout: 1 * time.Second, }, Timeout: 15 * time.Second,}
读取响应体时也要处理错误
即使请求成功且状态码正常,读取resp.Body时仍可能发生错误,比如网络中断、数据截断等。
body, err := io.ReadAll(resp.Body)if err != nil { log.Printf("读取响应体失败: %v", err) return}
记得始终调用resp.Body.Close()释放资源,推荐使用defer。
基本上就这些。关键是分清楚不同阶段的错误来源:连接层错误由http.Do返回,应用层错误看状态码,传输过程中读取失败单独处理,再加上合理的超时配置,就能写出健壮的HTTP客户端代码。
以上就是Golang如何处理网络请求返回错误的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1414232.html
微信扫一扫
支付宝扫一扫