Golang如何处理网络请求返回错误

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

golang如何处理网络请求返回错误

在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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月16日 07:57:03
下一篇 2025年12月16日 07:57:18

相关推荐

发表回复

登录后才能评论
关注微信