自然键和RESTful URL

时间:2014-07-10 04:00:59

标签: rest restful-url restful-architecture api-design

我正在设计一个RESTful API,它为所有资源使用数字主键。然而,一种类型的资源具有方便的自然键,我希望能够将其用作指定单个资源的可选方式。为了保持一致性,可以通过主键访问所有资源。

就目前而言,我可以这样做(假设23是主键):

mysite.com/api/v0/sites/23/

但是,我想知道是否有惯用方式为资源指定备用自然键。

到目前为止,我一直在考虑做这样的事情:

mysite.com/api/v0/sites/?domain-name=someothersite.com/

因此,主键和自然键(其域名)都可以访问单个站点资源。我主要关心的是以惯用的方式进行此操作,因为我希望尽可能简单地使用API​​。

4 个答案:

答案 0 :(得分:2)

在您的特定情况下,可以轻松地将主键(整数)与域名(包括句点的字符串)区分开来。在URL的同一位置允许两者似乎完全有效(且直观):

mysite.com/api/v0/sites/23
mysite.com/api/v0/sites/someothersite.com

记录它也很简单,因为每个都是站点的唯一标识符:

mysite.com/api/v0/sites/{id}
  id: primary key or fully-qualified domain name

答案 1 :(得分:1)

我也在努力寻找这个问题的满意答案。我已经开始实现与Mike Dunker建议的相同,但最终遇到了一些资源,因为它无法区分代理键和自然键。就在那时,我意识到我宁愿采用统一的方法,而不是混合不同的方式 - 就像你说的那样,是惯用的。

我发现的另一种方法是在http://soabits.blogspot.de/2013/10/url-structures-and-hyper-media-for-web.html(在"自然键,代理键,URL别名和资源重复"下)中描述的。

这个想法是将两个可能的密钥方案中的一个定义为规范密钥方案,并通过向URI添加一个段并使用HTTP 303(请参阅其他)重定向到规范URI来实现另一个。

因此,在您的示例中,您可以将mysite.com/api/v0/sites/23/作为规范ID,mysite.com/api/v0/sites/domain-name/someothersite.com/将使用HTTP 303和包含mysite.com/api/v0/sites/23/的位置标头进行回复(或反过来)。使用重定向的URI别名而不是"复制"由于http://www.w3.org/TR/webarch/#uri-aliases命名的原因,相同的资源很有用。

我没有使用此解决方案的原因之一是额外的HTTP往返,这在我们的项目设置中可能过于昂贵。

答案 2 :(得分:0)

通过使用key参数表示资源ID引用的自然键,这个概念比Mike's更强大:

mysite.com/api/v0/sites/23

mysite.com/api/v0/sites/someothersite.com?key=domain-name

在您的控制器中,您可以将密钥参数验证为仅作为您的自然密钥,而不是查询唯一索引的表元信息。如果您不想污染查询字符串,也可以使用HTTP标头。

答案 3 :(得分:0)

请注意,ORM实体或域实体不是资源。这些实体和资源之间可以存在映射。资源是一个应用程序接口概念,您可以使用这些资源上的资源和操作来描述服务的接口。

因此,您的主键不识别资源,而是识别实体。资源由URI标识。 URI不是唯一标识符,因此您可以使用多个URI来标识单个资源。

马克是对的,你可以使用类似的URI模板

mysite.com/api/v0/sites/{id}
mysite.com/api/v0/sites/{hostname}

如果您的路由框架支持按类型区分路由。因此,如果类型是数字,则将运行id路由,如果类型与主机名正则表达式模式匹配,则将运行主机名路由。否则,您可以合并2条路线,并使用您的代码手动区分它们。