如何在Golang中使用net/http处理HTTP请求_发送和接收数据
发布时间 - 2025-12-26 00:00:00 点击率:次Go中HTTP收发核心是服务端(http.ServeMux+ListenAndServe)与客户端(http.Client+NewRequest)分工:服务端用HandleFunc注册处理器,响应JSON等;客户端需自定义Client设超时,正确处理Body读写与关闭。
在 Go 中用 net/http 发送和接收 HTTP 数据非常直接,核心在于理解服务端(http.ServeMux + http.ListenAndServe)和客户端(http.Client + http.NewRequest)两种角色的分工。
接收请求:写一个简单的 HTTP 服务
服务端主要靠注册处理器函数来响应不同路径的请求。Go 内置的 http.HandleFunc 是最简方式:
- 它自动帮你把路径和函数绑定,并处理底层连接、解析请求头/体等细节
- 处理器函数签名固定为
func(http.ResponseWriter, *http.Request) -
http.ResponseWriter用于写响应状态码、头、正文;*http.Request包含所有请求信息(URL、Method、Header、Body、Form 等)
示例:启动一个返回 JSON 的 /api/user 接口
package mainimport ( "encoding/json" "net/http" )
type User struct { ID int
json:"id"Name stringjson:"name"}func userHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(User{ID: 123, Name: "Alice"}) }
func main() { http.HandleFunc("/api/user", userHandler) http.ListenAndServe(":8080", nil) // 启动服务器 }
读取请求数据:表单、JSON、查询参数和原始 Body
根据前端传来的数据格式,选择对应方式解析:
-
查询参数(URL 中 ?key=value):用
r.URL.Query().Get("key")或r.FormValue("key")(后者会自动调用ParseForm) -
表单数据(application/x-www-form-urlencoded):先调用
r.ParseForm(),再用r.PostFormValue("field") -
JSON 请求体:用
json.NewDecoder(r.Body).Decode(&v),注意r.Body只能读一次,需提前检查Content-Type -
原始字节流(如文件上传、自定义协议):用
io.ReadAll(r,记得关闭或 defer
.Body)r.Body.Close()
发送请求:用 http.Client 控制超时和重试
不要直接用 http.Get 这类快捷函数——它们用默认 client,无法设超时,容易阻塞。推荐显式创建带配置的 http.Client:
- 设置
Timeout防止请求无限挂起(例如网络故障时) - 可选配
Transport控制连接复用、TLS 设置、代理等 - 用
http.NewRequest构造请求,手动设置 Header、Body(比如加 Authorization、发 JSON)
示例:POST 一个 JSON 到远程 API
client := &http.Client{
Timeout: 5 * time.Second,
}
req, _ := http.NewRequest("POST", "https://api.example.com/data", strings.NewReader(`{"name":"Bob"}`))
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Printf("Status: %s, Body: %s", resp.Status, string(body))
常见陷阱与建议
-
http.Request.Body是io.ReadCloser,必须Close(),否则连接不释放,可能耗尽资源 - 用
http.Error(w, msg, code)快速返回错误响应,比手动写状态码更安全 - 避免在 handler 中启协程处理耗时任务后直接返回——要确保响应已写出,否则客户端收不到
- 生产环境别用
nil作为http.ListenAndServe的第二个参数,应传入自定义http.ServeMux或http.Handler方便测试和扩展
# js
# 前端
# json
# go
# golang
# 处理器
# app
# 字节
# ai
# 状态码
# Error
# 接口
# nil
# http
# 服务端
# 自定义
# 客户端
# 表单
# 两种
# 这类
# 第二个
# 你把
# 再用
# 绑定
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作企业网站建设方案,怎样建设一个公司网站?
IOS倒计时设置UIButton标题title的抖动问题
活动邀请函制作网站有哪些,活动邀请函文案?
如何在IIS中新建站点并配置端口与物理路径?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Android自定义控件实现温度旋转按钮效果
浅谈Javascript中的Label语句
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
高端云建站费用究竟需要多少预算?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Laravel怎么在Controller之外的地方验证数据
如何实现javascript表单验证_正则表达式有哪些实用技巧
Laravel如何处理表单验证?(Requests代码示例)
如何挑选高效建站主机与优质域名?
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Laravel如何使用Eloquent进行子查询
Laravel如何处理文件下载请求?(Response示例)
Bootstrap整体框架之CSS12栅格系统
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
三星、SK海力士获美批准:可向中国出口芯片制造设备
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
在Oracle关闭情况下如何修改spfile的参数
如何用好域名打造高点击率的自主建站?
如何用虚拟主机快速搭建网站?详细步骤解析
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
音响网站制作视频教程,隆霸音响官方网站?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
大连 网站制作,大连天途有线官网?
公司网站制作价格怎么算,公司办个官网需要多少钱?
php结合redis实现高并发下的抢购、秒杀功能的实例
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何生成腾讯云建站专用兑换码?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
EditPlus中的正则表达式 实战(1)
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
长沙做网站要多少钱,长沙国安网络怎么样?
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel怎么为数据库表字段添加索引以优化查询
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Java解压缩zip - 解压缩多个文件或文件夹实例
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
如何在阿里云香港服务器快速搭建网站?
如何在香港服务器上快速搭建免备案网站?


.Body)