如何在Golang中处理网络请求_Golang net/http包请求示例
发布时间 - 2026-01-22 00:00:00 点击率:次最基础的 GET 请求需调用 http.Get,defer resp.Body.Close() 防泄漏,用 io.ReadAll 读响应体,检查 StatusCode;POST JSON 要设 Content-Type、json.Marshal 后 bytes.NewReader;必须自定义 Client 设 Timeout;复用 Client 并配置 Transport 连接池。
怎么用 net/http 发 GET 请求并读取响应
最基础的场景:发一个 GET,拿到响应体内容。关键不是“能不能发”,而是别漏掉 resp.Body.Close() —— 不关会导致连接泄漏,压测时很快耗尽文件描述符。
常见错误现象:too many open files、请求变慢、后续请求超时。
- 必须用
defer resp.Body.Close()(注意是resp.Body,不是resp) - 用
io.ReadAll(resp.Body)读全部内容,别直接用resp.Body.Read()手动循环(容易读不全或阻塞) - 检查
resp.StatusCode,HTTP 状态码 200 不代表业务成功,但 4xx/5xx 通常该提前返回
resp, err := http.Get("https://httpbin.org/get")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
POST JSON 数据时怎么设置 header 和 body
发 JSON 是高频操作,但新手常卡在两处:没设 Content-Type,或把结构体直接传给 http.Post() —— 它只接受 []byte 或 io.Reader,不接受 struct。
使用场景:调第三方 API(如登录、提交表单),必须确保服务端能正确解析 JSON。
-
Content-Type: application/json必须显式设置,否则服务端可能当 text/plain 处理 - 用
json.Marshal()把 struct 转成[]byte,再用bytes.NewReader()包一层才能传给http.NewRequest() - 别用
http.Post(),它没法设 header;改用http.NewRequest()+h
ttp.DefaultClient.Do()
data := map[string]string{"name": "alice", "age": "30"}
jsonBytes, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", "https://www./link/dc076eb055ef5f8a60a41b6195e9f329", bytes.NewReader(jsonBytes))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
怎么加超时避免请求卡死
默认 HTTP client 没有超时,DNS 解析卡住、服务端不回包、网络抖动都会让 goroutine 永久挂起 —— 这是线上事故高发点。
性能影响:一个卡住的请求会拖垮整个 goroutine,如果并发量大,可能引发雪崩。
- 永远不要用
http.DefaultClient做生产请求;自定义http.Client并设Timeout -
Timeout是总超时(从发起到收到响应体结束),不是连接超时或读超时分开控制 - 如果需要更细粒度(比如连接 2s、读 5s),得用
Transport配DialContext和ResponseHeaderTimeout
client := &http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Get("https://httpbin.org/delay/15") // 超过 10s 就报错怎么复用连接避免频繁建连
短连接每请求都 TCP 握手 + TLS 协商,延迟高、CPU 消耗大。HTTP/1.1 默认支持 keep-alive,但得确保 client 和 server 都没禁用。
容易踩的坑:自己 new 出来没配 Transport 的 client,或者用了 http.DefaultClient 却没确认底层 Transport 是否被其他库污染。
- 复用
http.Client实例(全局或单例),不要每次请求都 new - 检查
Transport.MaxIdleConns和MaxIdleConnsPerHost,默认值太小(100/2),高并发时连接池不够用 - 确保服务端返回
Connection: keep-alive(现代服务基本都支持,但某些 Nginx 配置或老旧网关会强制 close)
client := &http.Client{
Transport: &http.Transport{
MaxIdleConns: 200,
MaxIdleConnsPerHost: 200,
IdleConnTimeout: 30 * time.Second,
},
}HTTP client 的行为细节藏在 http.Transport 和 http.Client 的字段里,而不是函数签名上。很多问题不是代码写错了,而是没意识到默认配置在生产环境根本不可用。
# js
# json
# go
# nginx
# golang
# app
# ai
# keep-alive
# dns
# 状态码
# 结构体
# 循环
# Struct
# 并发
# http
# 服务端
# 复用
# 自定义
# 发点
# 这是
# 连接池
# 都没
# 不代表
# 错了
# 用了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
js实现获取鼠标当前的位置
深圳网站制作培训,深圳哪些招聘网站比较好?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
清除minerd进程的简单方法
南京网站制作费用,南京远驱官方网站?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel如何使用Vite进行前端资源打包?(配置示例)
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Bootstrap整体框架之JavaScript插件架构
网站优化排名时,需要考虑哪些问题呢?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何在云主机上快速搭建网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
C++时间戳转换成日期时间的步骤和示例代码
个人网站制作流程图片大全,个人网站如何注销?
独立制作一个网站多少钱,建立网站需要花多少钱?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
JavaScript模板引擎Template.js使用详解
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel如何创建自定义Artisan命令?(代码示例)
网站制作壁纸教程视频,电脑壁纸网站?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel模型事件有哪些_Laravel Model Event生命周期详解
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
JS中对数组元素进行增删改移的方法总结
Android自定义控件实现温度旋转按钮效果
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
怎么用AI帮你为初创公司进行市场定位分析?
如何在建站主机中优化服务器配置?
如何挑选最适合建站的高性能VPS主机?
微信小程序 五星评分(包括半颗星评分)实例代码
如何快速辨别茅台真假?关键步骤解析
简单实现jsp分页
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
网站制作企业,网站的banner和导航栏是指什么?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
高性价比服务器租赁——企业级配置与24小时运维服务
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)


