net/http标准库:从零构建HTTP服务
Go Web开发入门用net/http标准库从零构建HTTP服务模块三开篇摘要: 本篇从Go标准库net/http出发演示如何用http.HandleFunc注册路由、处理请求参数、返回JSON响应、托管静态文件并实现优雅关闭。分享http.Server默认无超时配置的踩坑经历对比标准库与Web框架的适用场景开启模块三Go Web开发之旅。开篇故事模块二我们花了十几篇讲并发编程从goroutine到channel到race detector现在把目光转向Web开发。去年我接手一个内部运维平台的项目技术选型时团队争论用不用框架。我决定先从net/http标准库入手把底层搞明白再上框架。结果发现Go的标准库真的很能打一个HTTP服务核心代码就十来行。后来我用Gin的时候才真正理解了框架帮你封装了什么。如果直接学框架很多概念会一知半解。这篇我们从net/http开始搭建一个能处理路由、解析参数、返回JSON的HTTP服务。一、最小HTTP服务十行代码起步Go的net/http库开箱即用。packagemainimport(fmtnet/http)funcmain(){// 注册路由路径 / 的处理函数http.HandleFunc(/,func(w http.ResponseWriter,r*http.Request){// w 写响应r 读请求fmt.Fprintf(w,Hello, Go Web!)})// 启动服务阻塞当前goroutinefmt.Println(server started at :8080)iferr:http.ListenAndServe(:8080,nil);err!nil{fmt.Println(server error:,err)}}http.ResponseWriter是响应写入器*http.Request是请求对象。Go Web编程的本质就是读Request、写Response。二、路由注册与请求处理http.HandleFunc使用的是默认的DefaultServeMux它是一个全局的路由分发器。我们来看更完整的路由处理。packagemainimport(encoding/jsonfmtlognet/http)// User 用户数据结构// json tag 控制序列化后的字段名typeUserstruct{IDintjson:idNamestringjson:nameAgeintjson:age}// 模拟数据库varusers[]User{{ID:1,Name:张三,Age:28},{ID:2,Name:李四,Age:32},}// usersHandler 处理 /users 路由funcusersHandler(w http.ResponseWriter,r*http.Request){w.Header().Set(Content-Type,application/json)// 根据HTTP方法做不同处理switchr.Method{casehttp.MethodGet:// json.Marshal把结构体转成JSONdata,_:json.Marshal(users)w.Write(data)casehttp.MethodPost:// Decode从r.Body读取并解析JSONvaru Useriferr:json.NewDecoder(r.Body).Decode(u);err!nil{w.WriteHeader(http.StatusBadRequest)fmt.Fprintf(w,{error: invalid json})return}u.IDlen(users)1usersappend(users,u)w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(u)default:// 不支持的方法返回405w.WriteHeader(http.StatusMethodNotAllowed)fmt.Fprintf(w,{error: method not allowed})}}funcmain(){http.HandleFunc(/users,usersHandler)// 健康检查接口http.HandleFunc(/health,func(w http.ResponseWriter,r*http.Request){w.Header().Set(Content-Type,application/json)fmt.Fprintf(w,{status: ok})})log.Println(server started at :8080)log.Fatal(http.ListenAndServe(:8080,nil))}三、路径参数与查询参数Web开发中经常需要从URL里取参数。查询参数用r.URL.Query()路径参数需要手动解析。// 查询参数 /search?keywordgopage1funcsearchHandler(w http.ResponseWriter,r*http.Request){w.Header().Set(Content-Type,application/json)// Query() 返回 url.Values本质是 map[string][]stringquery:r.URL.Query()keyword:query.Get(keyword)// 不存在返回空字符串pageStr:query.Get(page)page,_:strconv.Atoi(pageStr)ifpage0{page1// 默认第一页}json.NewEncoder(w).Encode(map[string]any{keyword:keyword,page:page,})}// 路径参数 /users/123// 标准库没有内置路径参数需要手动TrimPrefixfuncuserHandler(w http.ResponseWriter,r*http.Request){w.Header().Set(Content-Type,application/json)// 手动从URL提取 /users/ 后面的部分path:strings.TrimPrefix(r.URL.Path,/users/)id,err:strconv.Atoi(path)iferr!nil{w.WriteHeader(http.StatusBadRequest)json.NewEncoder(w).Encode(map[string]string{error:ID必须是数字})return}json.NewEncoder(w).Encode(map[string]any{id:id})}/users和/users/的匹配规则不同。/users只匹配精确路径/users/会匹配所有以/users/开头的路径。这也是标准库路由的一个坑后来Gin用radix tree解决了这个问题。四、优雅关闭生产环境必备生产环境中服务不能说停就停。优雅关闭的核心是让服务停止接收新请求等已有请求处理完再退出。packagemainimport(contextfmtlognet/httposos/signalsyscalltime)funcmain(){// 自定义ServeMux避免全局状态污染mux:http.NewServeMux()mux.HandleFunc(/,func(w http.ResponseWriter,r*http.Request){time.Sleep(2*time.Second)// 模拟耗时操作fmt.Fprintf(w,done)})// 自定义Server配置超时生产必须做server:http.Server{Addr::8080,Handler:mux,ReadTimeout:10*time.Second,WriteTimeout:15*time.Second,IdleTimeout:60*time.Second,}// goroutine中启动服务主goroutine监听信号gofunc(){log.Println(server started at :8080)iferr:server.ListenAndServe();err!nilerr!http.ErrServerClosed{log.Fatalf(server error: %v,err)}}()// 监听CtrlC和SIGTERMsigChan:make(chanos.Signal,1)signal.Notify(sigChan,syscall.SIGINT,syscall.SIGTERM)sig:-sigChan log.Printf(收到信号 %v开始优雅关闭...\n,sig)// 给已有请求30秒处理时间ctx,cancel:context.WithTimeout(context.Background(),30*time.Second)defercancel()// Shutdown停止接收新连接等已有连接处理完iferr:server.Shutdown(ctx);err!nil{log.Printf(强制关闭: %v\n,err)}log.Println(server已停止)}五、独家踩坑http.Server默认无超时说一个我踩过的大坑。上线第一个版本的时候我直接用http.ListenAndServe(:8080, nil)没配任何超时。结果上线一周后服务CPU飙到100%排查发现是有人用慢速攻击客户端建立连接后慢慢发数据每个连接占一个goroutine最后goroutine堆积到几万个。http.ListenAndServe这个便捷函数内部创建的Server对象ReadTimeout、WriteTimeout、IdleTimeout全是零值也就是永不超时。这在开发环境没问题上了生产就是定时炸弹。// 错误写法生产环境不要用http.ListenAndServe(:8080,nil)// 正确写法自定义Server配置超时见上面优雅关闭代码server:http.Server{Addr::8080,Handler:mux,ReadTimeout:10*time.Second,WriteTimeout:15*time.Second,IdleTimeout:60*time.Second,}server.ListenAndServe()Go 1.22后net/http支持{id}路径参数和METHOD限制但参数绑定、中间件仍需自己写。这就引出了下一篇的Gin框架。六、对比分析与总结维度net/http标准库Gin等框架路由基础匹配1.22后增强radix tree参数路由参数绑定手动解析自动绑定结构体中间件需自己实现内置机制JSON手动调用encoding/json内置序列化适用场景简单服务、学底层中大型Web项目net/http标准库是Go Web开发的根基。理解了Handler、ServeMux、Request和Response的工作机制再学任何Go Web框架都会很轻松。模块三正式开始了。下一篇引入Gin框架看看它如何简化路由注册、参数解析和中间件开发。

相关新闻

告别存档丢失焦虑:3DS存档管理工具JKSM一次搞定备份与恢复

告别存档丢失焦虑:3DS存档管理工具JKSM一次搞定备份与恢复

告别存档丢失焦虑:3DS存档管理工具JKSM一次搞定备份与恢复 【免费下载链接】JKSM JKs Save Manager for 3DS 项目地址: https://gitcode.com/gh_mirrors/jk/JKSM 如果你手里还留着一台3DS,那你大概率也经历过那种瞬间头皮发麻的时刻——开机&…

2026/8/15 2:02:04 阅读更多 →
Pearcleaner 免费 Mac 应用清理工具实测:一次卸载连根拔起,残留文件再也不用手动清

Pearcleaner 免费 Mac 应用清理工具实测:一次卸载连根拔起,残留文件再也不用手动清

Pearcleaner 免费 Mac 应用清理工具实测:一次卸载连根拔起,残留文件再也不用手动清 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你…

2026/8/15 2:02:04 阅读更多 →
Python图书数据抓取实战:反爬对抗与结构化处理

Python图书数据抓取实战:反爬对抗与结构化处理

1. 项目背景与核心需求 图书数据抓取是爬虫领域的经典应用场景,但真正实现"优雅"的抓取需要解决三个核心问题:反爬对抗、数据清洗和结构化存储。我在帮某高校图书馆构建推荐系统时,曾用Python完整实现了从数据采集到结构化的全流程…

2026/8/15 2:01:04 阅读更多 →

最新新闻

WPS在线编辑对接实战:避坑指南与核心问题解析

WPS在线编辑对接实战:避坑指南与核心问题解析

1. 项目概述:WPS在线编辑对接的“暗礁”与“航标”如果你正在或即将进行WPS在线编辑功能的对接,那么这篇文章可能就是为你准备的“避坑指南”。WPS在线编辑,这个听起来很美的功能,能让用户在浏览器里直接编辑Word、Excel、PPT&…

2026/8/15 4:10:50 阅读更多 →
从OpenClaw到OpenAI:AI安全与模型可解释性人才的行业流动与启示

从OpenClaw到OpenAI:AI安全与模型可解释性人才的行业流动与启示

1. 从“OpenClaw”到“OpenAI”:一次人才流动背后的行业信号 最近,一个在科技圈,特别是AI开发者社区里引起不小讨论的消息是:OpenClaw的创始人加入了OpenAI。这个消息本身很简短,没有太多官方细节,但就像一…

2026/8/15 4:10:50 阅读更多 →
RPA+NLP技术提升销售需求管理效率

RPA+NLP技术提升销售需求管理效率

1. 项目背景与痛点分析 销售人员在日常客户沟通过程中,经常面临一个典型困境:客户提出的个性化需求往往在后续跟进时出现记忆模糊或遗漏。根据销售管理协会的调研数据显示,超过67%的销售人员在客户二次跟进时无法完整复现初次沟通的需求细节。…

2026/8/15 4:10:50 阅读更多 →
系统级瓶颈:文件描述符超限的深度诊断与跨平台解决方案

系统级瓶颈:文件描述符超限的深度诊断与跨平台解决方案

1. 问题引入:一个看似简单却棘手的系统级瓶颈“文件打开数超限”,这个错误提示对于在Windows或Linux环境下进行高并发开发、数据处理或者运维的朋友来说,绝对是个“老熟人”。你可能正在运行一个数据爬虫,突然日志里蹦出一行[Errn…

2026/8/15 4:10:49 阅读更多 →
从流水线到乱序执行:现代CPU性能优化的核心技术演进

从流水线到乱序执行:现代CPU性能优化的核心技术演进

1. 从“一条指令”到“千军万马”:现代CPU性能的演进逻辑如果你拆开一台电脑或服务器,看到那颗小小的CPU芯片,可能会好奇它究竟是如何工作的。很多人对CPU的理解还停留在“主频越高越快”的层面,这其实是一个巨大的误区。主频就像…

2026/8/15 4:10:49 阅读更多 →
构建企业级Amazon竞品价格监控体系:从数据采集到智能决策

构建企业级Amazon竞品价格监控体系:从数据采集到智能决策

1. 项目缘起:当价格战成为常态,被动应对的代价有多大?在电商领域,尤其是像Amazon这样的全球性平台上,价格战早已不是偶发事件,而是一种常态化的商业竞争策略。我见过太多企业,包括我服务过的一些…

2026/8/15 4:09:49 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →