优雅的实现 Golang REST API 架构
时间:2020-06-17 17:48
有一种说法,golang 编写的 API 不能像其他语言那样简单和通用。但实际上,我遇到很多 REST API 的代码,非常多的抽象,使得代码库变得混乱和复杂,最终伤害了可读性和可维护性。 这一系列,我们将通过如何建立一个产品级的 REST API TODO 列表,一个可持续扩展架构,从路由和代码接口开始,然后添加一个 mongo 的数据库和一个 badger 数据层,然后是授权协议层(OAuth 2.0) 在这一系列中我们将使用 chi 路由。 嗯,其实选择用什么并不重要。无论你使用什么来进行路由,本系列中讨论的概念都将是有用的。但是有下面的这些优点可以让我认为 Chi-router 比大多数替代方案更优越: 和 专为模块化/可组合 API 设计 - 中间件,内联中间件,路由组和子路由器安装 没有外部依赖---纯粹的就是 Go 1.7+ stdlib + net / http 强悍 --- 有很多公司正在使用,比如:Pressly,CloudFlare,Heroku,99Designs 轻量级 --- cloc'd in ~1000 LOC for the chi router 速度很快 我最喜欢的是,你为其他 net / http 兼容路由器编写的旧的 http 处理程序和中间件也可以在正常运行。 首先,我们创建一个 main.go 。我们程序的基础(或者说中心元件 ?) r.Mount("/api/todo", todo.Routes()) router.Route("/v1", ....) 笔者(基于 Ajinkya 在评论中提到的问题,我会更多的阐述 walk 方法): chi 路由有一个方法叫做 walk。这个方法接收的参数: A router A callback. 每个被定义的路由都会被回调,并且接收 4 个参数: 路由定义的方法 实际路由的字符串 处理器(函数),处理给定路由的请求 给定路由中,定义过的中间件列表(中间件是一个比较简单的函数,它会在处理器被调用前调用,所以它们才会被使用在请求处理之前,授权等) 以我为例,我将简单地轮询路由并且打印所有被定义的路由。从而让我对所有可用的路由一目了然。 todo 包有一个返回所有路由的方法。这些路由都是写在 main.go 文件中。 实际上我通常会把这些路由写在一个叫 routes.go 的文件中, 这样会很容易在包里找到. 处理程序具有 使用 render.JSON,一个 encoding/json 的封装, 它会自动转义你 JSON 响应中所有的 html,并设置 content-type 为 application/json 你被它有多简单吓到了吗?可以在 GitHub 上查看这个项目 https://github.com/tonyalaribe/todoapi/tre.... 在我们本系列的下篇文章中, 我们会继续对配置和共享状态的支持。 大多数项目通常都需要额外的配置,例如数据库连接,等等。 我们将会在下篇文章里讨论这个。 推荐教程:《Go教程》 以上就是优雅的实现 Golang REST API 架构的详细内容,更多请关注gxlsystem.com其它相关文章!为什么选择用 Chi ,而不是用标准库或者 Gin 或者 router-x 进行路由?
net/http
标准库 100% 兼容---可以在 Go 生态系统中使用任何与net / http 兼容的 http 或中间件 pkg让我们开始吧
上面的代码是一些最佳实践的重点
接下来我们构建一个 todo 包,它实际上保存了我们 todo 逻辑。
注意事项
func (w http.ResponseWriter,r *http.Request)
的函数签名,这意味着这处理程序和你使用标准库的 net/http 写法没有不同。