You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Go语言http/net包请求时,如何在错误场景下获取响应状态码?

Go http请求错误时获取响应状态码的正确姿势

在Go的net/http包中,http.Client.Do()返回的err和response并非完全互斥:

  • 当请求根本无法到达服务器(比如DNS解析失败、连接超时),err非nil且response为nil
  • 当服务器已经返回了响应(哪怕是5xx、4xx这类错误状态码),err会是nil,此时直接通过response.StatusCode判断即可
  • 极少数场景下,请求已发送且服务器返回了响应,但读取响应过程中出错,此时err非nil但response可能存在

针对你遇到的问题,正确的处理逻辑应该先检查response是否存在,再处理状态码,同时确保关闭响应体避免资源泄漏:

response, err := http.DefaultClient.Do(req)

// 优先处理response存在的情况,不管是否有err
if response != nil {
    defer response.Body.Close() // 必须关闭Body,否则会导致连接池资源泄漏
    if response.StatusCode == 503 {
        // 处理503服务不可用的逻辑
    }
}

// 再处理请求过程中的底层错误
if err != nil {
    return []byte{}, err
}

// 后续处理正常响应逻辑

核心注意点:

  • 永远不要在err != nil的分支里直接访问response,必须先判断response != nil
  • 只要response不为nil,一定要用defer关闭Body,这是Go http请求的基本规范
  • 服务器返回的4xx/5xx状态码不属于Do()方法的错误范畴,需要你主动判断StatusCode来处理

内容的提问来源于stack exchange,提问作者Andrew Rusinas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:33:13