如何在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() —— 它只接受 []byteio.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),得用 TransportDialContextResponseHeaderTimeout
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.MaxIdleConnsMaxIdleConnsPerHost,默认值太小(100/2),高并发时连接池不够用
  • 确保服务端返回 Connection: keep-alive(现代服务基本都支持,但某些 Nginx 配置或老旧网关会强制 close)
client := &http.Client{
    Transport: &http.Transport{
        MaxIdleConns:        200,
        MaxIdleConnsPerHost: 200,
        IdleConnTimeout:     30 * time.Second,
    },
}

HTTP client 的行为细节藏在 http.Transporthttp.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两种方式)