新闻中心
如何使用Golang实现RESTful API_使用net/http和JSON解析构建接口
用Go标准库实现RESTful API的关键是:定义带json标签的导出结构体解析请求,用ServeMux结合路径截取模拟REST路由,封装writeJSON/writeError统一响应,最后通过http.ListenAndServe启动服务。

用 Go 的 net/http 和标准库 encoding/json 实现 RESTful API 并不复杂,关键在于合理组织路由、正确处理请求/响应、统一错误反馈,以及保持代码可读和可维护。
定义结构体并绑定 JSON 请求
Go 中解析 JSON 请求体最常用方式是通过结构体标签(json:)映射字段。注意导出字段(首字母大写)才能被 JSON 包访问。
例如用户注册接口需要接收 JSON:
type UserCreateRequest struct {
Name string `json:"name"`
Email string `json:"email"`
Age int `json:"age"`
}
在 handler 中解析:
func createUser(w http.ResponseWriter, r *http.Request) {
var req UserCreateRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
// 处理业务逻辑,比如存入内存或数据库
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"status": "created"})
}
用 ServeMux 或自定义路由实现 REST 风格
net/http.ServeMux 支持基础路径匹配,适合小型 API。RESTful 路由建议按资源设计,如 /users、/users/{id}。
- GET /users → 列出所有用户
- POST /users → 创建用户
- GET /users/123 → 获取 ID 为 123 的用户
- PUT /users/123 → 更新用户
- DELETE /users/123 → 删除用户
由于 ServeMux 不支持路径参数(如 {id}),可用简单字符串截取或升级为轻量路由器(如 gorilla/mux)。但纯 net/http 也能应付:
TabTab AI
首个全链路 Data Agent,让数据搜集、处理到深度分析一步到位。
326
查看详情
http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
parts := strings.Split(r.URL.Path, "/")
if len(parts) < 3 {
http.Error(w, "Bad path", http.StatusBadRequest)
return
}
id := parts[2]
switch r.Method {
case "GET":
getUserByID(w, r, id)
case "PUT":
updateUserByID(w, r, id)
case "DELETE":
deleteUserByID(w, r, id)
default:
http.Error(w, "Method not allowe
d", http.StatusMethodNotAllowed)
}
})
统一响应格式与错误处理
避免每个 handler 都手动设 header 和状态码。封装一个响应工具函数更清晰:
func writeJSON(w http.ResponseWriter, status int, v interface{}) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
json.NewEncoder(w).Encode(v)
}
func writeError(w http.ResponseWriter, msg string, status int) {
writeJSON(w, status, map[string]string{"error": msg})
}
使用示例:
if req.Name == "" {
writeError(w, "name is required", http.StatusBadRequest)
return
}
启动服务并监听端口
最后启动 HTTP 服务,建议加日志和基本 panic 恢复(生产环境推荐用 http.Server 配置超时等):
func main() {
http.HandleFunc("/users", listUsers)
http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
// 如上路由分发逻辑
})
fmt.Println("Server starting on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
运行后即可用 curl 测试:
curl -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{"name":"Alice","email":"alice@example.com","age":30}'
基本上就这些。不用框架也能写出干净、符合 REST 原则的 API,重点是结构体映射准确、路由逻辑清晰、错误反馈及时——其余就是 Go 本身简洁有力的风格在起作用。
以上就是如何使用Golang实现RESTful API_使用net/http和JSON解析构建接口的详细内容,更多请关注其它相关文章!
# 沈阳seo自动优化软件
# 资源管理
# 如何在
# 相关文章
# 中文网
# 自定义
# 解决问题
# 不支持
# 宿迁推广网络营销哪家好
# 也能
# 免费推广营销网站大全
# 深圳seo关键词优化排名软件
# 营销推广软件项目
# 节能设备产业网站建设
# 寻甸推广营销渠道
# 沧州淘宝网站推广简介
# 系统运维网站优化
# 修文县网站优化营销
# curl
# json
# go
# golang
# app
# 路由器
# 端口
# 工具
# usb
# js
# ai
# switch
# 路由
# 状态码
# re
# 加载
# 如何使用
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
AO3中文官网链接_AO3网页版稳定镜像站
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
菜鸟取件码是什么怎么查 最全查询渠道汇总
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录
qq游戏网页版直接玩_qq游戏免下载快速入口
将JSON对象数组转置为键值对列表的实用指南
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
痛风发作了怎么办? 快速止痛和后期饮食调理
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
PHP URL参数传递与500错误调试指南
微博网页版主页入口 微博官方网站免登录访问
如何提高微信支付的安全性_微信支付安全防护与设置建议
微信网页版登录教程_微信网页版登录入口在哪
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
汽车之家官方网站官网入口_汽车之家网页版直接进入
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
R星幕后开发视频泄露 包含《GTA6》等多款大作
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
使用Python高效删除Word宏并转换DOCM为DOCX格式
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
Python:递归比较文件夹内容并找出特定类型文件的差异
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题
Golang如何使用net/url解析URL_Golang URL解析与处理方法
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
一加 14R 快充无反应_一加 14R 充电优化
windows10怎么查看本机ip_windows10命令提示符ipconfig使用
word中如何让数字纵向排列_Word数字纵向排列方法
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
拼多多赚钱渠道_拼多多收益来源
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件


2025-12-15
浏览次数:次
返回列表
d", http.StatusMethodNotAllowed)
}
})