如何使用Golang实现RESTful API_Golang REST接口设计与请求处理方法
发布时间 - 2026-01-08 00:00:00 点击率:次net/http 可构建轻量 REST 服务:需手动精确匹配路径、解析 URL 参数、一次性读取 Body、导出结构体字段并加 json tag、校验 Content-Type、用 http.Error 或封装函数返回错误、显式处理 OPTIONS 预检并设置 CORS 头。
用 net/http 启动最简 REST 服务,别急着上框架
Go 原生 net/http 完全够用,尤其在中小规模 API 场景。过早引入 gin 或 echo 反而掩盖路由匹配、中间件执行顺序等关键细节。
-
http.HandleFunc注册路径时,前缀匹配是隐式的:注册/api/users会同时响应/api/users/123—— 需手动检查r.URL.Path是否精确匹配 - 使用
http.ServeMux自定义路由时,注意它不支持路径参数(如/users/{id}),必须自己解析r.URL.Path并提取id - 启动服务务必显式指定端口和错误处理:
if err := http.ListenAndServe(":8080", nil); err != nil && err != http.ErrServerClosed { log.Fatal(err) }
正确解析 JSON 请求体,避免 io.EOF 和空结构体
常见错误是直接对 http.Request.Body 多次调用 json.Unmarshal —— Body 是单次读取流,第二次读就会返回 io.EOF。
- 始终用
io.ReadAll(r.Body)一次性读完,再传给json.Unmarshal;不要试图复用r.Body - 结构体字段必须首字母大写且带
jsontag,否则反序列化后字段为空:type User struct { Name string `json:"name"` } - 用
r.Header.Get("Content-Type")检查是否为application/json,非 JSON 请求应返回415 Unsupported Media Type
用 http.Error 统一返回错误,别拼接字符串
手写 w.WriteHeader(400); w.Write([]byte(`{"error":"xxx"}`)) 容易遗漏状态码、Content-Type 或格式不一致。
- 优先用
http.Error(w, "bad request", http.StatusBadRequest),它自动设状态码和text/plain类型 - 若需返回 JSON 错误,单独封装函数:
func writeJSONError(w http.ResponseWriter, msg string, code int) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(code) json.NewEncoder(w).Encode(map[string]string{"error": msg}) } - 注意
http.Error不会终止 handler 执行,后续代码仍会运行,必要时加return
处理 CORS 时,OPTIONS 预检请求必须显式响应
浏览器发跨域请求前会先发 OPTIONS,如果没处理,前端卡在 pending 状态,控制台只显示 “CORS error”。
- 在 handler 开头判断:
if r.Method == "OPTIONS" { w.WriteHeader(http.StatusOK); return } - 必须设置以下响应头:
Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers - 如果允许携带 cookie,还需加
Access-Control-Allow-Credentials: true,且Allow-Origin不能为*
# js
# 前端
# json
# go
# cookie
# golang
# 浏览器
# app
# access
# 端口
# usb
# ai
# 路由
# 跨域
# restful
# 中间件
# gin
# echo
# EOF
# String
# if
# 封装
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何在Windows服务器上快速搭建网站?
如何在橙子建站中快速调整背景颜色?
如何做网站制作流程,*游戏网站怎么搭建?
Swift中switch语句区间和元组模式匹配
在线制作视频网站免费,都有哪些好的动漫网站?
如何快速搭建二级域名独立网站?
Laravel怎么判断请求类型_Laravel Request isMethod用法
Laravel怎么实现模型属性的自动加密
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何配置任务调度?(Cron Job示例)
如何在IIS中新建站点并配置端口与物理路径?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
JS中对数组元素进行增删改移的方法总结
WordPress 子目录安装中正确处理脚本路径的完整指南
利用JavaScript实现拖拽改变元素大小
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
高端建站三要素:定制模板、企业官网与响应式设计优化
如何在Tomcat中配置并部署网站项目?
想要更高端的建设网站,这些原则一定要坚持!
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
phpredis提高消息队列的实时性方法(推荐)
JavaScript如何操作视频_媒体API怎么控制播放
如何在万网自助建站平台快速创建网站?
Laravel如何生成URL和重定向?(路由助手函数)
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
5种Android数据存储方式汇总
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
如何彻底卸载建站之星软件?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
如何破解联通资金短缺导致的基站建设难题?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
JS去除重复并统计数量的实现方法
Laravel如何实现模型的全局作用域?(Global Scope示例)
如何在云指建站中生成FTP站点?
JavaScript实现Fly Bird小游戏
浅谈redis在项目中的应用
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
网易LOFTER官网链接 老福特网页版登录地址
如何快速建站并高效导出源代码?

