【问题标题】:How to manage multiple APIs in Rails如何在 Rails 中管理多个 API
【发布时间】:2016-01-30 22:48:07
【问题描述】:

我有一个为多个客户端提供服务的 Rails 后端:

  • Angular JS 应用程序
  • iOS 应用

起初,我只有 iOS 应用程序,并在向客户端带来重大更改时使用 Rails 中的经典 API 版本控制(将我的版本命名为 v1v2 等)。

当我们提出 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 写道:

我不知道如何让/api/asdf/users 匹配,因为您如何确定这是否应该是对/api/<resource>/<identifier>/api/<version>/<resource> 的请求?

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

问题

我应该如何管理多个 API,但它们并不像版本?

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

  • api/angular/v1
  • api/ios/v5(也将 v1..v4 移动到 api/ios/
  • api/android/v1

是否有任何最佳做法可以做到这一点?还是我应该只使用当前的 API 版本控制系统,知道哪个版本对应哪个客户端?

【问题讨论】:

    标签: ruby-on-rails api routes versioning


    【解决方案1】:

    我认为这最终是一个设计问题。你的 API 应该被认为是在网络 MVC 中访问你的模型的方法。就像在任何 MVC 中一样,模型应该独立于它的视图和控制器。我认为每个客户端使用不同的 API 几乎就像为每个客户端使用不同的模型一样,我认为这不是您想要的。

    作为一个例子,(我假设你的 API 是 Restful),一个 GET 请求

    api/v1/user/1
    

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

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

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

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

    【讨论】:

    • 应用比较复杂,一开始并没有想到 Rails 后端可以处理 iOS,因此 Angular 和 iOS 需要的数据有很多差异。如果我们按照您的方式(为每个客户端使用通用 API),最困难的部分将是更新我们的 iOS 应用程序以处理新的 API。但我认为这是我们负担得起的,因为它将大大简化维护......
    • 我接受了这个答案,因为在仔细考虑之后,我们认为单一 API 在功能和可维护性方面都更有意义。
    【解决方案2】:

    关于 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 系统的准确程度。

    我将如何维护两个独立的 API?(来自评论)

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

    【讨论】:

    • 感谢您的回答,这绝对是我可以使用的东西。但是,您在某一点上也是正确的,我也不喜欢我必须维护 2 个完全分离的 API 的事实。也许我把整个 API 版本控制弄错了。您将如何管理多客户端 API,例如使用 iOS,您不能期望您的用户更新客户端,也不能立即发布您的新版本(Apple App 审核流程...)?
    • 再次感谢!这是一个有价值的答案,我可以用来决定做什么。由于 API 现在确实不同,我想我会首先将控制器中实际存在的大部分逻辑转移到模型中,然后考虑为这些不同的客户端处理路由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多