如何在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 Request502 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标签不被解析的问题