
本文介绍在 Go 语言中通过 http.Get 发起请求后,安全、高效地读取并转换纯文本(plain/text)HTTP 响应为字符串的方法,涵盖 io.ReadAll 的使用、错误处理、资源释放及编码注意事项。
本文介绍在 go 语言中通过 `http.get` 发起请求后,安全、高效地读取并转换纯文本(plain/text)http 响应为字符串的方法,涵盖 `io.readall` 的使用、错误处理、资源释放及编码注意事项。
在 Go 中处理 HTTP GET 请求的纯文本响应,核心在于正确读取 response.Body 并将其解码为字符串。response.Body 是一个实现了 io.ReadCloser 接口的流式数据源,不能直接转换为字符串,必须先完整读取字节流,再进行类型转换。
最简洁可靠的方式是使用 io.ReadAll(Go 1.16+ 推荐;旧版本可用 ioutil.ReadAll,但已弃用):
responseData, err := io.ReadAll(response.Body)
if err != nil {
log.Fatalf("failed to read response body: %v", err)
}
responseString := string(responseData)
⚠️ 注意事项:
- 务必调用 defer response.Body.Close():防止连接泄漏和文件描述符耗尽;
- io.ReadAll 会一次性将整个响应体加载到内存,适用于中小规模响应(如配置文本、API 状态页);若响应极大(如大文件下载),应改用流式处理(如 io.Copy 或分块读取);
- 字符编码需显式处理:string() 转换默认按 UTF-8 解释字节。若服务端返回非 UTF-8 编码(如 GBK、ISO-8859-1),需借助 golang.org/x/text/encoding 包进行转码,否则将出现乱码;
- 检查 HTTP 状态码:response.StatusCode 应为 200 OK 等成功状态,避免对 4xx/5xx 响应误解析;
- 设置超时:生产环境推荐使用带超时的 http.Client,而非默认客户端:
client := &http.Client{
Timeout: 10 * time.Second,
}
response, err := client.Get(url)
完整可运行示例:
package main
import (
"fmt"
"io"
"log"
"net/http"
"time"
)
func main() {
url := "https://httpbin.org/get" // 返回 JSON,但内容为纯文本格式(可验证)
client := &http.Client{Timeout: 5 * time.Second}
response, err := client.Get(url)
if err != nil {
log.Fatal("request failed:", err)
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
log.Fatalf("HTTP error: %d", response.StatusCode)
}
data, err := io.ReadAll(response.Body)
if err != nil {
log.Fatal("failed to read body:", err)
}
fmt.Println("Response as string:")
fmt.Println(string(data))
}
总结:获取纯文本响应的本质是「读取字节流 → 转换为字符串」,io.ReadAll + string() 是标准、安全且符合 Go 惯例的做法。结合状态码校验、超时控制与资源清理,即可构建健壮的 HTTP 文本客户端逻辑。











