Golang实现REST API架构

有一种说法,golang 编写的 API 不能像其他语言那样简单和通用。但实际上,我遇到很多 REST API 的代码,非常多的抽象,使得代码库变得混乱和复杂,最终伤害了可读性和可维护性。

这一系列,我们将通过如何建立一个产品级的 REST API TODO 列表,一个可持续扩展架构,从路由和代码接口开始,然后添加一个 mongo 的数据库和一个 badger 数据层,然后是授权协议层(OAuth 2.0)

在这一系列中我们将使用 chi 路由。

Golang实现REST API架构

为什么选择用 Chi ,而不是用标准库或者 Gin 或者 router-x 进行路由?

嗯,其实选择用什么并不重要。无论你使用什么来进行路由,本系列中讨论的概念都将是有用的。但是有下面的这些优点可以让我认为 Chi-router 比大多数替代方案更优越:

  • net/http 标准库 100% 兼容—可以在 Go 生态系统中使用任何与net / http 兼容的 http 或中间件 pkg

  • 专为模块化/可组合 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 。我们程序的基础(或者说中心元件 ?)

Golang实现REST API架构

上面的代码是一些最佳实践的重点

  1. 用一个单独的包来实现路由的逻辑,并将它们分好组,然后安装(mount) 它们:

r.Mount("/api/todo", todo.Routes())

  1. 给 API 打上版本,这样你就可以对 api 进行更新时,不会破坏旧的客户端:

router.Route("/v1", ….)

  1. 使用中间件作为扩展。使用了非常多路由的代码是非常笨重的,其实可以变成链接的中间件,像:授权,设置响应头部,压缩,请求日志,限速等。

笔者(基于 Ajinkya 在评论中提到的问题,我会更多的阐述 walk 方法):

chi 路由有一个方法叫做 walk。这个方法接收的参数:

  • A router

  • A callback.

每个被定义的路由都会被回调,并且接收 4 个参数:

  • 路由定义的方法

  • 实际路由的字符串

  • 处理器(函数),处理给定路由的请求

  • 给定路由中,定义过的中间件列表(中间件是一个比较简单的函数,它会在处理器被调用前调用,所以它们才会被使用在请求处理之前,授权等)

以我为例,我将简单地轮询路由并且打印所有被定义的路由。从而让我对所有可用的路由一目了然。

接下来我们构建一个 todo 包,它实际上保存了我们 todo 逻辑。

Golang实现REST API架构

注意事项

  • todo 包有一个返回所有路由的方法。这些路由都是写在 main.go 文件中。 实际上我通常会把这些路由写在一个叫 routes.go 的文件中, 这样会很容易在包里找到.

  • 处理程序具有 func (w http.ResponseWriter,r *http.Request) 的函数签名,这意味着这处理程序和你使用标准库的 net/http 写法没有不同。

  • 使用 render.JSON,一个 encoding/json 的封装, 它会自动转义你 JSON 响应中所有的 html,并设置 content-type 为 application/json

你被它有多简单吓到了吗?可以在 GitHub 上查看这个项目 https://github.com/tonyalaribe/todoapi/tre….

在我们本系列的下篇文章中, 我们会继续对配置和共享状态的支持。 大多数项目通常都需要额外的配置,例如数据库连接,等等。 我们将会在下篇文章里讨论这个。

以上就是优雅的实现 Golang REST API 架构的详细内容,更多请关注北单博客其它相关文章!

原创文章,作者:VTEVT,如若转载,请注明出处:https://www.beidanyezhu.com/a/26439.html

(0)
VTEVT的头像VTEVT
上一篇 2025-01-03 14:41:14
下一篇 2025-01-03

相关推荐

  • golang中string和int类型相互转换的示例

    go语言string转int的方法:首先创建一个go示例文件;然后通过“int, err := strconv.Atoi(string)”方法将string转int即可。 gola…

  • golang中导入包的方法

    这篇文章运用简单易懂的例子给大家介绍golang中导入包的方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 import Go 使用包(package)作为…

  • 如何升级golang的版本

    升级Golang 主要步骤: 1、卸载旧版本 2、下载新版本 3、安装新版本 4、配置环境变量 详细步骤: 1、卸载旧版本 首先,执行 go env,列出关于go的环境信息,查看 …

  • golang有哪些数据类型

    这期内容当中小编将会给大家带来有关golang有哪些数据类型,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 在 Go 编程语言中,数据类型用于声明函数和变量。…

  • golang是什么

    golang是什么?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。 Go(又称Golang)是Google开发的一种静态…

  • 如何用golang实现约瑟夫环

    约瑟夫环概念: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从…

    2025-01-02
  • golang的字符串操作

    Go语言简介 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫(Robert Griesemer),罗勃…

  • golang中的链接link是什么

    链接(link) 我们编写的程序可能会使用其他程序或程序库( library ) 正如我们在helloworld程序中使用的fmt package 我们编写的程序必须与这些程序或程…

  • golang的内存分配

    本篇文章主要介绍golang的内存分配,文中关于内存分配的算法以及mcache的介绍均以实例展示,有需要的朋友可以参考一下。 程序内存大致可以分为5个段text、data、bss、…

    2025-01-01
  • golang中gopath的介绍

    这篇文章主要介绍了golang中gopath工具,具有一定借鉴价值,需要的朋友可以参考下。如下资料是关于gopath的详细步骤内容。 前言 在本章中,我们将介绍go语言的项目结构、…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部