如何在 Rails 中管理多个 API

How to manage multiple APIs in Rails

我有一个服务于多个客户端的 Rails 后端:

起初,我只有 iOS 应用程序,并在 rails 中使用经典的 API 版本控制,当对客户端进行重大更改时(将我的版本命名为 v1, v2 等等).

当我们想出 Angular 前端时,我们需要一个特定的 API,所以我做了一个新版本,我只使用 Angular(假设 v5).

那时,v1v4 专用于 iOS,v5 到 Angular。

显然,我可以同时更新我的​​后端和我的 Angular API,因为每次访问网站时都会向客户提供这两者。因此,不需要对 Angular API 进行版本控制。

但是,我正处于需要更新我的 iOS API 的时候,它开始变得非常错误:v1..v4 用于 iOS,v5 由 Android 使用。所以假设的下一个 iOS API 应该是... v6?肯定错了。

我想知道是否可以命名一个 API 版本 angular,多亏了这个 answer on SO 我明白了为什么这是不可能的。我会为我的案例引用有趣的部分:

Ryan Bigg wrote:

I couldn't figure out how to get /api/asdf/users to match, because how do you determine if that is supposed to be a request to /api/<resource>/<identifier> or /api/<version>/<resource>?

现在你更了解我的情况了,问题来了。

问题

我应该如何管理多个 API,但它们又不是真正的版本?

是否可以细分API个版本?喜欢:

这样做有什么最佳做法吗?或者我应该只使用当前的 API 版本控制系统,知道哪个版本对应哪个客户端?

关于您引用 Ryan Bigg 的路由问题,您可以通过对路由应用约束来解决它。例如:

get /api/:type/:version/users/all, to: "users#index", constraints: {type: /(ios|angular)/, version: /\d+/}

确保版本是一个数字并且类型是 "ios" 或 "angular",您可以轻松地为两个单独的 API 设置路由。

回答是否可能的问题——是的。一切皆有可能,尤其是 Ruby!

首先,我不会有两个单独的 API 来管理。但是,如果我这样做了,我会为每个 API 创建单独的名称空间并将其命名为 AngularAPIIosAPI。我会单独路由到他们。正确答案将取决于您设置 API 系统的准确程度。

我如何维护两个单独的 APIs?(来自评论)

这取决于 API 的差异有多大。如果只有一些差异,那么简单地使用具有不同路由的不同控制器是有意义的。例如,AngularUsersControllerIosUsersController。他们都将扩展 ApiUsersController 并仅更改每个平台所需的内容。随着它的增长,这仍然允许进行适当的版本控制,并且还可以防止代码重复。

我觉得这归根结底是设计问题。您的 API 应该被视为在网络 MVC 中访问您的模型的方法。正如在任何 MVC 中一样,模型应该独立于它的视图和控制器。我认为每个客户有不同的 API 几乎就像每个客户都有不同的模型,我认为这不是您想要的。

例如,(我假设您的 API 是 Restful),向

发出 GET 请求
api/v1/user/1

可能 return 用户 1 的 json "view",您的每个客户端都应编写为使用相同的输出。如果您决定不再支持此功能,或者从 returned json 中添加或删除某些会破坏现有客户端的内容,那么您可能会更改版本并在该版本上实施更改

我建议您的下一个 API 版本公开您当前拥有的任何客户端所需的所有资源,然后加班更新您的客户端以使用这个新的统一 API。如果您发现自己对模型 (API) 进行的更改会破坏现有客户端,那么您可以发布新版本,允许现有客户端继续使用旧的 API 和新的或更新的客户端可以选择新版本。

在您的 API 上进行的一组自动化测试将有助于确定您何时破坏现有客户端。

我不是这方面的专家,但我确实(作为一个学习项目)创建了一个带有 api 的 rails 应用程序,并且我能够使用相同的 api android 和 ios.