如何在Golang中发送JSON请求_Golang net/http JSON请求方法
发布时间 - 2026-01-11 00:00:00 点击率:次最直接方式是用http.Post发送固定JSON请求,但需json.Marshal后bytes.NewReader包装;更推荐http.Client+http.NewRequest以精确控制超时、header等。
用 http.Post 发送简单 JSON 请求最直接
如果只是发一个固定结构的 JSON 到某个 API,不需要自定义 header 或复用 client,http.Post 是最快路径。它自动设置 Content-Type: application/json,但注意:它不处理错误响应体,只检查网络层错误。
-
http.Post第三个参数必须是io.Reader,不能直接传 struct;得先用json.Marshal编码成字节切片,再用bytes.NewReader包装 - 返回的
*http.Response需要手动调用resp.Body.Close(),否则会泄漏连接 - 它默认使用全局
http.DefaultClient,不支持超时控制——这点在生产环境容易出问题
data := map[string]string{"name": "alice", "role": "dev"}
payload, _ := json.Marshal(data)
resp, err := http.Post("https://api.example.com/users", "application/json", bytes.NewReader(payload))
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
用 http.Client + http.NewRequest 精确控制请求行为
多数真实场景需要设置超时、自定义 header、复用连接或处理 4xx/5xx 响应体,这时必须自己构造 *http.Request 并用 *http.Client 发送。
-
http.NewRequest不会自动设Content-Type,必须显式调用req.Header.Set("Content-Type", "application/json") -
http.Client.Timeout控制整个请求生命周期(DNS + 连接 + 写入 + 读取),不是仅连接超时 - 若需更细粒度控制(比如只限制后端响应时间),得用
context.WithTimeout传给client.Do
client := &http.Client{
Timeout: 10 * time.Second,
}
data := struct{ Name string }{"bob"}
payload, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", "https://api.example.com/users", bytes.NewReader(payload))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer xyz")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
接收 JSON 响应时别忘了检查 resp.StatusCode
http.Client.Do 只在网络失败时返回 error,HTTP 状态码如 400 Bad Request 或 502 Bad Gateway 都算“成功响应”,必须手动判断。否则可能把错误响应当正常数据解码,导致 panic 或逻辑错乱。
- 常见误操作:直接对
resp.Body调用json.Decode,却不检查resp.StatusCode - 建议统一处理:状态码非 2xx 时,先读取并记录
resp.Body内容(用于调试),再返回错误 - 注意
resp.Body只能读一次
;如果日志里已读过,后续 json.Decode会得到空数据
结构体字段导出与 JSON tag 决定序列化结果
Go 的 json.Marshal 只序列化导出字段(首字母大写),且受 json: tag 控制。没加 tag 时默认用字段名小写,但嵌套或命名不一致时极易出错。
- 字段名含下划线(如
User_id)不会自动转成user_id,必须显式写json:"user_id" - 想忽略空值字段,用
json:",omitempty";但要注意:零值字符串""、数字0、布尔false都会被跳过 - 私有字段(小写开头)无论有没有 tag,都不会被编码——这不是 bug,是 Go 的反射规则
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
token string `json:"token"` // 这个字段不会出现在 JSON 中
}
真正容易卡住的地方,往往不是怎么发,而是响应状态码没检查、Body 被重复读、或者结构体字段没导出却以为能序列化。
# js
# json
# go
# golang
# 编码
# app
# 字节
# 后端
# ai
# dns
# 状态码
# gate
# gateway
# Error
# 字符串
# 结构体
# 数据结构
# Struct
# 切片
# http
# bug
# 自定义
# 序列化
# 复用
# 不需要
# 出现在
# 下划线
# 这不是
# 布尔
# 不支持
# 只在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
七夕网站制作视频,七夕大促活动怎么报名?
如何在宝塔面板中创建新站点?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
C语言设计一个闪闪的圣诞树
利用JavaScript实现拖拽改变元素大小
Laravel如何处理异常和错误?(Handler示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何在IIS7中新建站点?详细步骤解析
北京网站制作的公司有哪些,北京白云观官方网站?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何在万网ECS上快速搭建专属网站?
javascript读取文本节点方法小结
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Thinkphp 中 distinct 的用法解析
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
如何在阿里云虚拟主机上快速搭建个人网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
EditPlus中的正则表达式 实战(2)
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
如何构建满足综合性能需求的优质建站方案?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
千库网官网入口推荐 千库网设计创意平台入口
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何在服务器上配置二级域名建站?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
Laravel怎么使用Intervention Image库处理图片上传和缩放
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
网易LOFTER官网链接 老福特网页版登录地址
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
活动邀请函制作网站有哪些,活动邀请函文案?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
移动端脚本框架Hammer.js
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Laravel如何为API编写文档_Laravel API文档生成与维护方法
如何在Windows服务器上快速搭建网站?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Laravel如何升级到最新版本?(升级指南和步骤)
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Linux系统运维自动化项目教程_Ansible批量管理实战
如何在云指建站中生成FTP站点?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
用v-html解决Vue.js渲染中html标签不被解析的问题


;如果日志里已读过,后续