Go 中的 Rest API - 使用 net/http 与 Gorilla 之类的库

Posted

技术标签:

【中文标题】Go 中的 Rest API - 使用 net/http 与 Gorilla 之类的库【英文标题】:Rest APIs in Go - using net/http vs. a library like Gorilla 【发布时间】:2016-11-10 21:17:39 【问题描述】:

我看到 Go 本身有一个包 net/http,它足以提供启动和运行自己的 REST API 所需的一切。但是,有多种框架;最受欢迎的可能是gorilla

考虑到我需要做的主要事情之一是构建 REST API 来访问一些后端存储(数据库、缓存等)以执行 CRUD 操作,这样比较好Go 的标准库本身,还是我应该考虑使用一些框架?

通常,人们编写一个新的库或框架来解决现有库中存在的问题。但是,当实际需求很简单时,许多框架也会使事情变得更糟。

所以我有几个问题:

    go lang 中的基本库是否足以支持 REST 的基本到中等功能?

    如果我最终使用内置库并且明天必须更改它以使用某些框架(如大猩猩),那会有多困难/成本?

    框架真的是在解决问题还是只是让简单的问题变得复杂?

我会非常感谢有人在这里分享他的想法(他自己也经历过这个选择),同时我自己研究更多。

【问题讨论】:

您想到了哪些具体的用例? 现在,它是简单的 Get 调用(我的 Api 从一些后端存储中提取数据),它可能是数据库(Sql 或 No Sql)或缓存或两者兼而有之。展望未来,它也可以是所有 CRUD 操作。话虽如此,还有其他事情(整洁的错误处理等)。 【参考方案1】:

    net/http 包对于大多数场景来说可能已经足够了,但是如果你想简化你的开发,你应该使用第三方包,比如 Gorilla。 例如,net/httpServeMux 在路由固定 URL 路径的传入请求方面做得很好,但对于使用变量的漂亮路径,您需要在使用 Gorilla 时实现自定义多路复用器,您可以免费获得这个。

    另一个例子是如果你想指定 RESTful 资源 正确的 HTTP 方法,很难使用标准 http.ServeMux,同时使用 Gorilla 的 mux 包, 可以根据 URL 主机、路径、路径前缀匹配请求, 方案、标头和查询值以及 HTTP 方法。

    Gorilla 的一大好处是它与net/http 包完全兼容,将来可以替代。

    见 1。

我完全鼓励您使用 Gorilla 的工具包来开发 REST 服务。

【讨论】:

非常感谢 Shmulik,这正是我在这里寻找的答案 请记住,gorilla 并不是唯一的选择——我一直在使用更轻量级的 httprouter,并且我已经取得了很好的成功。它没有那么多功能,就功能而言,它介于内置包和大猩猩之间。【参考方案2】:

内置的net/http 包足以构建完整的REST API。但是,某些库可以使构建 API 稍微容易一些,尤其是在 REST API 很复杂的情况下。从内置工具更改为任何体面的框架都相对简单——它们通常接受 http.Handler 类型的处理程序。

不过,归根结底,这是一个极端情境的选择。你能做的最好的事情是检查每个可用的解决方案,对比和比较,如果可能的话,用最佳选项构建概念验证。第一手经验将为您提供最佳指导。

【讨论】:

感谢阿德里安的回复。是的,我同意并且正在寻求做一些概念证明来直接探索更多的东西。但是 POC 只能做很少的事情(我所能做的只是简单的休息 API,我认为这很容易,并且可能无法回答我在这里看到的内容)。所以我想在一个更广泛的论坛上向那些花了一些时间用 Go 构建东西的开发人员提出这个问题。你的回答让我明白了一些道理。

以上是关于Go 中的 Rest API - 使用 net/http 与 Gorilla 之类的库的主要内容,如果未能解决你的问题,请参考以下文章

带有REST和Open API的gRPC

哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?

从 Angular 中的 REST API 获取 HTTPS 时出错

Python / Django 中的 REST API

SpringBoot Rest API 中的 EntityManager 和 SessionHolder 错误

有没有办法使用 Django REST 框架中的可浏览 API 上传文件?