如何使用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 场景。过早引入 ginecho 反而掩盖路由匹配、中间件执行顺序等关键细节。

  • 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
  • 结构体字段必须首字母大写且带 json tag,否则反序列化后字段为空: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-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers
  • 如果允许携带 cookie,还需加 Access-Control-Allow-Credentials: true,且 Allow-Origin 不能为 *
实际项目里,最难调试的往往是预检失败和 Body 重复读取——这两个点没踩过坑的人,多半还没真正跑通第一个 POST 接口。


# 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官网链接 老福特网页版登录地址  如何快速建站并高效导出源代码?