【发布时间】:2017-08-06 20:55:26
【问题描述】:
我有一个带有 RESTful API 的应用,其中包含两个主要包。
一个包通过简单的 CRUD 操作公开数据库模型。它的一般目的只是为另一个服务和前端应用程序提供一些基础数据。它有版本控制以避免更新时出现其他服务错误:/api/v{number}/
其他包表示具有繁重数据库查询的业务逻辑,以避免前端聊天行为。它仅由前端应用程序使用。没有版本控制。
两个包都使用相同的 ORM 模型和 DB。
此应用仅供内部使用,没有外部客户或用户。只是我们公司。
主要的麻烦是决定如何在 URL 中表示这些特征。有两种选择:
1.对两个包使用相同的 URL 根:
domain.com/api/v{number}/...
2。使用不同的 URL 根:
domain.com/api/v{number} 用于简单的 CRUD api
domain.com/views/ 用于业务逻辑接口
第一个选项。
-
优点:
- 我们的开发人员可以在没有数据库结构知识的情况下使用 API,只需 API 文档。
- 前端开发人员只记住名称,而不是位置。
-
缺点:
- 命名问题。同一实体具有不同的数据库/业务表示。它会导致丑陋的模棱两可的名字,比如 entity_infos、entity_details、entity_deep等
- 业务 API URL 中的永久
/v1/,因为没有版本控制。
第二个选项。
-
优点:
- 业务 API 没有 URL 版本控制。
- 没有命名问题。
-
缺点:
- 没有抽象。您知道何时使用单表或繁重的业务逻辑。
- 前端应用程序使用具有相同资源名称的不同 API 根。这可能会让人感到困惑,尤其是对于新开发者而言。
如您所见,一个人的优点就是另一个人的缺点。
我想听听经过充分论证的意见以及一些相关链接。 谢谢。
【问题讨论】:
-
可能是一个愚蠢的问题,但如果这些资源的表示不同,为什么不通过表示来区分它们呢?
application/vnd.domain.v{number}+json和application/vnd.domain.view+json? -
@sschrass AFAIK 对于按 MIME 类型区分资源的解决方案不是很流行。您应该为任何请求指定标头,从而在客户端指定更多代码。构建请求变得更加棘手,并且看起来不是很友好和明显。还有一个问题:我们在服务器端使用带有蓝图的flask-restfult,并且没有开箱即用的基于内容类型的路由。我相信有办法实现它,但它看起来不像是阻力最小的路径。
-
你说的绝对有效。我相信同样正确的是,相同的模型得到不同的表示,所以表示对我来说是一个明显的选择。我一般不喜欢自定义媒体类型,但在这种情况下它看起来可以接受。我对烧瓶没有经验,但是接受标头没有路由让我有点吃惊。