
本文介绍如何使用 Go 标准库的 net/http 和 io 包,安全、高效地发起 HTTP 请求,读取响应体,并将网页 HTML 内容完整转换为字符串,便于后续文本处理或解析。
本文介绍如何使用 go 标准库的 `net/http` 和 `io` 包,安全、高效地发起 http 请求,读取响应体,并将网页 html 内容完整转换为字符串,便于后续文本处理或解析。
在 Go 中获取网页内容本质上是执行一次 HTTP GET 请求,并将响应体(response body)读取为字节切片,再转换为字符串。以下是一个健壮、可复用的实现:
package main
import (
"fmt"
"io"
"log"
"net/http"
)
// OnPage 发起 HTTP GET 请求,返回网页原始 HTML 字符串
// 若请求失败或读取出错,会记录错误并 panic(生产环境建议返回 error)
func OnPage(link string) string {
resp, err := http.Get(link)
if err != nil {
log.Fatalf("HTTP 请求失败: %v", err)
}
defer resp.Body.Close() // 确保响应体始终关闭,避免资源泄漏
content, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("读取响应体失败: %v", err)
}
return string(content)
}
func main() {
html := OnPage("https://httpbin.org/html") // 推荐使用支持 CORS 和调试的测试地址
fmt.Printf("获取到 %d 字节的 HTML 内容\n", len(html))
fmt.Println(html[:min(200, len(html))] + "...") // 打印前 200 字符示意
}
// 辅助函数:Go 1.21+ 可直接用 slices.Min,此处兼容低版本
func min(a, b int) int {
if a < b {
return a
}
return b
}⚠️ 关键注意事项:
-
必须调用
resp.Body.Close():即使使用defer,也需确保在读取后关闭,否则可能引发连接池耗尽或内存泄漏; -
检查 HTTP 状态码:上述示例未校验
resp.StatusCode(如 404/500),实际项目中建议添加判断:if resp.StatusCode != http.StatusOK { log.Fatalf("HTTP 状态码异常: %d", resp.StatusCode) } -
超时控制:生产环境应设置客户端超时,避免无限等待:
client := &http.Client{ Timeout: 10 * time.Second, } resp, err := client.Get(link) -
错误处理策略:
log.Fatal适合演示,但真实服务应返回string, error并由调用方决定重试或降级; -
编码处理:
io.ReadAll返回原始字节,若网页含非 UTF-8 编码(如 GBK),需借助golang.org/x/net/html/charset等库自动检测并转换。
掌握这一基础模式后,你可进一步结合 strings, regexp, 或 golang.org/x/net/html 包进行内容提取、清洗或结构化解析。

















