如何在 Golang 中构建生产级 REST API - 猿码设计师https://www.yuanmadesign.com/ymdesign/go-router
有一种说法是,用 golang 编写的 API 不能像其他语言那样简单和惯用。实际上,我遇到过很多 REST API 代码库,这些代码库复杂混乱,其中包含很多的抽象,最终损害了可读性和可维护性。
在这个系列中,我们将介绍如何构建一个生产级的 todo list rest api,它将有机地增长,从代码结构和路由等开始,然后添加一个 mongo db 和一个 badger 数据存储 层,然后是认证层。
我们将在本系列中使用 chi 路由器。
为什么是chi?为什么不是标准库、Gin 或 router-x?
这并不重要。无论您使用什么路由器,文中将讨论的概念都适用。但是下面的清单让我认为 chi router 是比大多数替代品更好的选择:
- 100% 兼容 net/http – 使用生态系统中也兼容 net/http 的任何 http 或中间件 pkg
- 专为模块化/可组合 API 设计 – 中间件、内联中间件、路由组和子路由器安装
- 没有外部依赖 – Go 1.7+ stdlib + net/http
- 稳健 – 在 Pressly、CloudFlare、Heroku、99Designs 和许多其他公司进行生产
- 轻量级——在 ~1000 LOC 中用于 chi 路由器
是的,它真的很快。我最喜欢的是,您为其他 net/http 兼容路由器编写的旧 http 处理程序和中间件也可以在这里工作。
让我们开始吧。首先我们创建我们的 main.go。我们计划的基石:
上面代码中一些最佳实践的亮点
1. 将路由分组到各个包中的逻辑组,然后挂载这些路由:
r.Mount("/api/todo", todo.Routes())
2. 版本API,所以你可以在不破坏旧客户端的情况下进行api更新:
router.Route("/v1", ....)
3. 广泛使用中间件。大多数被多个路由大量使用的代码都可以变成可链接的中间件。例如身份验证、设置响应标头、压缩、请求记录、速率限制等。
chi 路由器有一个名为 walk 的方法。该方法接收:
- 一个路由器
- 一个回调
路由器上定义的每个路由调用回调,并接收 4 个参数:
- 为路由定义的方法
- 实际的路由字符串
- 处理给定路由请求的处理程序(函数)
- 为给定路由定义的中间件列表(中间件只是在调用处理程序之前调用的简单函数,因此它们用于预处理请求、身份验证等)
在我的示例中,我只是简单地走过路由器并打印所有定义的routes。这有助于我一目了然地查看所有可用routes。
接下来我们构建 todo 包,它实际上保存了我们的 todo 逻辑。
注意事项
- todo 包有一个返回所有路由的函数。的路线安装在 main.go 中。在实践中,我通常会将这些路由添加到名为 routes.go 的文件中,因此在包中很容易找到。
- 处理程序具有 func (w http.ResponseWriter,r *http.Request) 的函数签名,这意味着如果您在标准库中使用 net/http,您将编写的处理程序没有不同的形式。
- 使用 render.JSON 它只是 encoding/json 的一个包装器,它会自动转义 JSON 响应中的所有 html,并将内容类型设置为 application/json