用 net/http 快速启动 Todo API 需:1. 路由与业务分离,用 ServeMux 注册后转交独立 handler;2. 每次读取 req.Body 后必须 Close;3. 统一 JSON 错误响应并设 Content-Type;4. 结构体字段首字母大写+json 标签;5. ID 用 uuid.NewString() 生成并校验存在;6. 手动处理 CORS,显式响应 OPTIONS 并设置允许方法与来源。怎么用 net/http 快速启动一个 Todo API 服务Go 原生 net/http 完全够用,不需要一开始就上 gin 或 echo。关键在于别把路由和业务逻辑混写,否则加个字段就要改三处。用 http.ServeMux 注册路径,但立刻转给独立 handler 函数(比如 handleCreateTodo),别在 http.HandleFunc 里写业务逻辑所有请求体必须显式调用 req.Body.Close(),漏掉会导致连接不释放、后续请求卡住http.Error 默认返回 text/plain,前端解析 JSON 失败时容易懵------统一用 json.NewEncoder(w).Encode(mapstringstring{"error": "xxx"}) + 手动设 w.Header().Set("Content-Type", "application/json; charset=utf-8")为什么 encoding/json 解析 POST 数据总出空结构体90% 是因为没读取或没关闭 req.Body,或者 struct 字段没加导出标签。Go 的 JSON 解析器只认首字母大写的导出字段。必须先调用 io.ReadAll(req.Body) 或 json.NewDecoder(req.Body).Decode(&todo),不能跳过读取直接解码struct 字段要加 json:"title" 标签,且首字母必须大写:Title string `json:"title"`,写成 title string 就永远是零值如果前端发的是 application/x-www-form-urlencoded,得用 req.ParseForm() + req.FormValue("title"),不是 json.Decode如何安全地给 Todo ID 生成和校验逻辑别用 math/rand 加时间戳拼接,也别暴露自增数据库 ID。简单项目用 uuid.NewString()(需 github.com/google/uuid)最省心。生成 ID 后立刻存入 map 或 slice,不要等收到请求才查------否则并发写 map 会 panicURL 路径里的 ID(如 /todos/{id})必须在 handler 开头校验是否存在,不存在就返回 404,别让后续逻辑空跑如果用内存存储,注意 map 不是并发安全的;读多写少可用 sync.RWMutex 包一层;写频繁就换 sync.Map,但记住它不支持遍历为什么本地测试能过,部署后 CORS 报错Go 默认不处理跨域,浏览器拦的是 OPTIONS 预检请求,不是你的 GET/POST。光加 Access-Control-Allow-Origin: * 不够。 Mokker AI AI产品图添加背景
相关推荐
鬼手点金5 分钟前
opencode-crawl4ai使用建议海天一色y13 分钟前
深入理解对偶单纯形法:原理推导与 Python/MATLAB 编程实现NPE~13 分钟前
CMDB科普:配置管理数据库——运维相关Highcharts.js19 分钟前
动态数据可视化架构:Highcharts + PHP + MySQL 从数据库到数据渲染专业程序开发源19 分钟前
springboot校园志愿者管理系统28562-计算机课程设计、毕业设计计算机毕业编程指导师32 分钟前
计算机毕设怎么做?Python+Hadoop的跨平台消费者评论情感分析与数据可视化系统实战 源码 毕业设计 选题推荐 毕设选题 数据分析余槐i38 分钟前
WAL 下写并发仍是 1:SQLite 单写者模型实测与绕开方案阳光九叶草LXGZXJ9 小时前
达梦数据库-报错-15-列【XXX】长度超出定义怕浪猫9 小时前
RAG 面试 6 连问,从原理到优化全部覆盖高洁019 小时前
具身智能中的世界模型训练