我们将为我们的 API 代码实现一个版本控制系统,该系统基于 sinatra 构建,并且将有一个默认的 API 版本,客户端将能够选择添加 HTTP Accept Header 的特定版本。
现在我想了解您是否将 API 版本信息严格保留在控制器中,或者您允许 api 版本以某种方式在您的模型中传递。如果将它保存在控制器中,那么在模型中传播 API 版本有什么缺点?
我们将为我们的 API 代码实现一个版本控制系统,该系统基于 sinatra 构建,并且将有一个默认的 API 版本,客户端将能够选择添加 HTTP Accept Header 的特定版本。
现在我想了解您是否将 API 版本信息严格保留在控制器中,或者您允许 api 版本以某种方式在您的模型中传递。如果将它保存在控制器中,那么在模型中传播 API 版本有什么缺点?
对您的 API 进行版本控制并不意味着您的控制器在内部处理版本控制,然后与也在内部处理版本控制的模型进行通信。相反,这意味着您应该拥有不同版本的控制器和模型,您可以根据请求中的 API 版本在运行时换入和换出。
现在,我从提到 Sinatra 推测您正在使用 Ruby。我对 Sinatra 或 Ruby 知之甚少,但我为 ASP.NET MVC 4 回答了一个类似的问题,并讨论了由 Sebastiaan Dammann 编写的版本控制框架。
也许看看 Ruby 是否已经存在类似的框架。
在 RESTful API 设计中,版本控制是通过选择媒体类型来完成的,我相信这就是您想要做的。如果我对第二段的理解正确,您是在问版本信息是否也应该在交付的响应中(即文档模型的一部分)?
这样的决定是任意的,但许多格式在其内部携带版本信息,以防它们通过元数据(例如版本信息)可能丢失的有损系统。出于这个原因,我建议将其放入您的模型中。