十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用GoFrame HTTP服务器快速搭出RESTful API服务:一个用户服务的完整走通

如何用GoFrame HTTP服务器快速搭出RESTful API服务:一个用户服务的完整走通 如何用GoFrame HTTP服务器快速搭出RESTful API服务一个用户服务的完整走通【免费下载链接】gfA powerful framework for faster, easier, and more efficient project development.项目地址: https://gitcode.com/GitHub_Trending/gf/gf先说结论一个能上生产的API服务路径并不长——定路由、绑参数、挂校验和中间件再配上文档和监控就齐了。GoFrame 是 Go 语言开发框架这篇文章就用 GoFrame 的 HTTP 服务器net/ghttp组件快速构建 RESTful API不拆功能清单而是围绕同一个用户服务从头走一遍每个环节都是真代码跟着抄完就能跑。五分钟最小可运行服务环境上只需装好 Go1.18然后拉取框架go get -u github.com/gogf/gf/v2写一个能跑的服务器只要这几行package main import ( github.com/gogf/gf/v2/frame/g github.com/gogf/gf/v2/net/ghttp ) func main() { s : g.Server() s.SetPort(8080) // 默认端口是 80这里改成 8080 s.BindHandler(/ping, func(r *ghttp.Request) { r.Response.Write(pong) }) s.Run() }g.Server()拿的是一个开箱即用的服务器实例内部封装了路由、日志、OpenAPI 等默认配置见 frame/g。BindHandler把一段函数绑到指定路径上s.Run()之后服务就起来了。访问http://localhost:8080/ping收到pong五分钟的最小目标达成 用户服务第一步RESTful 风格的路由设计最小服务只是能跑真正要设计成资源风格。约定路径即资源/user是列表/user/{id}是详情方法即动作GET 查、POST 建、PUT 改、DELETE 删公共前缀用分组隔离方便以后加版本把用户服务的骨架挂上去s : g.Server() api : s.Group(/api/v1) // 分组之后加 /api/v2 时互不影响 { api.BindHandler(GET /user, listUsers) api.BindHandler(POST /user, createUser) api.BindHandler(GET /user/{id}, getUser) // {id} 是路径参数 api.BindHandler(DELETE /user/{id}, deleteUser) } s.SetPort(8080) s.Run()处理器就放在同包里先给个占位实现func getUser(r *ghttp.Request) { id : r.Get(id) // 路径参数框架已自动解析进请求 r.Response.WriteJson(g.Map{id: id}) }一次配好参数绑定与校验一个结构体搞定/user的 POST 请求需要收用户名和年龄。手写r.Get再逐个转类型太繁琐GoFrame 的做法是把参数声明成结构体框架自动完成解析和类型转换type CreateUserReq struct { Name string json:name v:required#用户名不能为空 Age int json:age v:between:1,150#年龄不合法 } func createUser(r *ghttp.Request) { var req CreateUserReq if err : r.Parse(req); err ! nil { // 解析 校验一步到位 r.Response.WriteJsonExit(g.Map{code: 400, error: err.Error()}) return } r.Response.WriteJson(g.Map{code: 0, data: req}) }r.Parse把 JSON body 里的字段按标签灌进结构体v标签里的规则由内置校验器执行错误信息直接带出来——参数校验一个结构体标签就能搞定不用自己写任何 if 判断。把日志、CORS 与鉴权中间件一次挂齐中间件就是请求链路上的拦截器在处理器执行前后各做点事。这里挂三个全部服务同一个用户服务。s : g.Server() // 1. 全局长耗时日志 s.Use(func(r *ghttp.Request) { start : time.Now() r.Middleware.Next() // 必须调它请求才会继续往下走 r.Logger().Infof(took %dms, time.Since(start).Milliseconds()) }) // 2. 跨域框架内置直接引用 s.Use(ghttp.MiddlewareCORS) // 3. 鉴权只挂在 /api/v1 分组上不影响别的路由 api : s.Group(/api/v1) api.Use(func(r *ghttp.Request) { if r.Header.Get(Authorization) { r.Response.WriteStatus(http.StatusUnauthorized) r.ExitAll() // 终止后续处理器 return } r.Middleware.Next() })三点说明s.Use是全局拦截分组上再挂Use就只对组内生效r.Middleware.Next()是放行动作忘了调用请求会卡住CORS 这类通用需求不必自己写ghttp包里已内置见 net/ghttp。中间件的执行顺序是先进后出日志包在最外层所以它打印的耗时包含鉴权在内 从能用到可靠让服务器读配置文件代码里写死端口、路径不便于多环境部署。在工作目录放一个config.toml启动时框架会自动应用[server]段[server] Address :8080 ServerRoot ./public # 静态资源目录 IndexFiles [index.html] SessionIdName gfsessionid # session cookie 名配置项和ServerConfig结构体字段一一对应源码见 net/ghttp/ghttp_server_config.go想改什么先搜这个文件就行字段名即配置名。用注释生成 Swagger 文档给处理器补上 OpenAPI 注释再配置两个路径文档就是自动的// Summary 获取用户详情 // Param id path int true 用户ID // Success 200 {object} ghttp.DefaultHandlerResponse func getUser(r *ghttp.Request) { /* 同前文 */ }[server] OpenApiPath /api/openapi.json # 文档输出地址 SwaggerPath /swagger # 浏览器访问的 UI 页面启动后访问/swagger就能看到可在线调用的接口文档结构定义可参考 net/goai。用 pprof 做性能剖析压测发现慢了别猜。开一个剖析端点s.EnablePProf(/pprof) // 访问 /pprof 查看 goroutine、内存、CPU 数据配合go tool pprof定位热点函数比看日志靠谱得多。生产上线清单构建gf build -m prod -a amd64 -o myapp命令行工具源码在 cmd/gf压缩对响应大的接口挂 gzip 中间件减少传输体积剖析EnablePProf保留但收紧访问权限别裸奔在生产上文档OpenApiPath上线前确认已生成联调效率提升明显缓存热点数据如用户配置用 os/gcache 缓一层配置端口、日志路径等全部走config.toml不留魔法数字传输生产环境上 HTTPS证书路径同样写进配置状态用框架内置的 pprof 端点和日志观察运行状况异常先看日志再看指标写在最后到这里一个带路由、校验、中间件、文档和监控的用户服务就完整跑通了。想继续深入直接翻 net/ghttp 的源码注释和各目录下的*_z_example_test.go示例比任何教程都新 【免费下载链接】gfA powerful framework for faster, easier, and more efficient project development.项目地址: https://gitcode.com/GitHub_Trending/gf/gf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表