使用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
相关产品推荐
相关产品推荐

