具有多个主键的资源的 REST API URI

Posted

技术标签:

【中文标题】具有多个主键的资源的 REST API URI【英文标题】:REST API URI for resource with multiple primary keys 【发布时间】:2016-06-04 09:49:36 【问题描述】:

我正在为我的项目开发一个通用 REST API,我想知道当我有一个具有 2 个或更多主键的表/资源时该怎么办。

例如,假设我有一个名为“question”的表,其中包含两个主键(日期和类型),并且我需要创建资源 REST URI。遵循标准架构 api/resource/id 的最佳方法是什么?

也许是这样的:api/question/:date,:type?最好的方法是什么?

谢谢。

【问题讨论】:

【参考方案1】:

我认为你所说的多个主键是一个复合键。对吧?

也许,最适合您的选择是:

api/questions/date/:date/type/:type

对于您的情况,将其作为 http 资源阅读更为自然,即使在您的应用程序中使用 api/question/date/:date 没有意义。

另一种选择是:

api/questions/:date/type/

【讨论】:

好方法。 如果您的实体有另一个实体 id 作为复合 id 怎么办。表达整个层次结构?我们只是为了遵循层次结构建议而放置琐事,因为我们实际上只需要 topicId 和 questionId 来检索问题 trivia/topic/topicId/question/questionId【参考方案2】:

你走在正确的道路上,我认为你绝对应该在资源 url 中同时包含日期和类型,如果这是你唯一可以识别它的唯一方法

api/question/date_type

【讨论】:

您认为将多个主键指定为 url 的一部分并加上任何特殊字符(下划线)是个好主意吗?【参考方案3】:

这是何时使用蛞蝓的一个很好的例子。这个对 What is a slug 的回答很好地说明了如何在 api 设计中使用复合主键。

这样,您就有了几个选择。哪个是最好的将是一个意见问题,什么适合您的需求。

api/question/:date/:type 或 api/question/:key1/:key2/.../:keyn

同样的模式也可以应用于以下。

api/question/:date_:type

api/question/:date-:type

【讨论】:

【参考方案4】:

我认为一个资源有两个主键不是一个好主意。 REST 很大程度上依赖于resources 及其表示形式。

如果您遇到一个资源有两个标识符的情况 - 然后重新设计您的应用程序(可以通过在将其映射到其他标识符后在后端创建另一个键)并将这些多个键添加为资源中的属性.

如果您想创建真正世界级的 REST API,想法是“保持简单”。

奖励:您不需要向客户/开发人员教授一些额外的东西来了解您使用 API 所做的一些花哨的事情。

【讨论】:

以上是关于具有多个主键的资源的 REST API URI的主要内容,如果未能解决你的问题,请参考以下文章

具有多个附加到列表的主键的数据库

具有两个独立主键的实体的 RESTful API 行为

引用具有多个外键的两列主键

Mysql - 将值插入具有未知主键的多个表中

使用在多个列上具有主键的实体框架更新数据库

使用 Cloudformation 创建具有复合主键的 DynamoDB