
本文介绍在 Go 中发起 HTTP GET 请求后,如何安全、高效地读取并转换服务器返回的纯文本响应为字符串,涵盖 io.ReadAll 的使用、错误处理及字符编码注意事项。
本文介绍在 go 中发起 http get 请求后,如何安全、高效地读取并转换服务器返回的纯文本响应为字符串,涵盖 `io.readall` 的使用、错误处理及字符编码注意事项。
在 Go 中处理 HTTP 响应时,response.Body 是一个实现了 io.ReadCloser 接口的流式数据源,不能直接当作字符串使用。要获取纯文本内容,需先完整读取字节流,再进行类型转换。
最简洁可靠的方式是使用 io.ReadAll(Go 1.16+ 推荐;旧版本可用 ioutil.ReadAll,但已弃用):
responseData, err := io.ReadAll(response.Body)
if err != nil {
log.Fatal("failed to read response body:", err)
}
responseString := string(responseData)
⚠️ 注意事项:
- 必须调用 defer response.Body.Close():防止连接泄漏(你已在代码中正确添加,这是关键习惯);
-
检查 response.StatusCode:http.Get 只检查网络层错误,不校验 HTTP 状态码(如 404、500)。建议添加状态检查:
if response.StatusCode != http.StatusOK { log.Fatalf("HTTP %d: %s", response.StatusCode, http.StatusText(response.StatusCode)) } - 字符编码需与服务端一致:string() 转换假设字节为 UTF-8 编码。若服务端返回 ISO-8859-1 等编码,需借助 golang.org/x/text/encoding 包解码;
- 大响应体慎用 ReadAll:对超大文本(如百 MB 日志),应改用流式处理(如 bufio.Scanner 或分块读取),避免内存溢出。
完整可运行示例(含状态码验证):
package main
import (
"fmt"
"io"
"log"
"net/http"
)
func main() {
url := "https://httpbin.org/get" // 返回 JSON,但响应体为 UTF-8 文本,适合测试
resp, err := http.Get(url)
if err != nil {
log.Fatal("request failed:", err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
log.Fatalf("unexpected status: %s", resp.Status)
}
data, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal("failed to read body:", err)
}
text := string(data)
fmt.Println("Response length:", len(text), "chars")
fmt.Println("First 100 chars:", fmt.Sprintf("%.100s", text))
}
总结:io.ReadAll(response.Body) + string() 是处理小到中等规模纯文本响应的标准范式。始终校验状态码、关闭 Body、关注编码,并根据响应大小选择合适读取策略,即可稳健应对绝大多数文本 API 场景。











