2011-07-12 33 views
1

在我们的系统中,我们拥有包含项目的帐户。一个项目总是与一个帐户关联,但在系统中也具有全球唯一的ID。有时只需知道其ID就可以使用该项目。RESTful API创建全球唯一资源

允许从外部所有者(账户)访问下级资源(项目)是不正确的?换句话说,拥有2个URI到同一个资源是错误的吗?这是一个有点棘手解释那么这里有一个例子:

POST /inventory/accountId 
    #Request Body contains new item 
    #Response body contains new item's id 

GET|PUT|DELETE /inventory/accountId/guid #obviously works and makes sense 

GET|PUT|DELETE /inventory/guid #does this make sense? 

也许我应该重新思考自己的资源布局,而不是使用帐户创建项目,而是把帐户作为该项目的查询字符串参数或领域?

POST /inventory 
    # Request body contains item w/ account name set on it 

GET|POST|DELETE /inventory/uuid #makes sense 

GET|POST|DELETE /inventory/accountId/uuid #not allowed 

回答

1
POST /inventory/accountId 
GET|PUT|DELETE /inventory/accountId/guid #obviously works and makes sense 
GET|PUT|DELETE /inventory/guid #does this make sense? 

这是最有意义的时候/inventory/guid重定向到/inventory/accountId/guid(或者,我要说,反之亦然)。拥有一个单一的规范实体,并且多个URI重定向到它,可以让您的缓存方案保持最直接的状态。如果这两个URI返回的是相同的数据,那么用户不可避免地会将一个新的表示重新放入一个表单中,然后在从另一个表单获取旧副本时会被混淆,因为缓存只对前者无效。两者的后续GET可能会出现类似的问题。重定向保持更清洁(不完全同步,但更清洁)。

是否使项目从属于账户取决于项目是否可以存在没有账户。如果某个项目的数据是某个帐户数据的子集,请继续并使其成为下级。如果您发现某个帐户只是一种容器,或者某些项目没有任何容器,则将其提升到最高级别。

+0

我认为重定向是最有意义的,如果我要支持多个URI的。考虑一下之后,我会试着避免这一点。为了在帐户下创建项目,我忘了我可以使用Location标头来指示创建资源的URI,这样可以消除我最担心的问题。 –

1

换句话说,这是错误的有2 URI的相同的资源?

不是。让多个URI标识相同的资源并没有错。我的第一个方法也没有看到任何问题。请记住,URI是唯一的标识符,对客户端应该是不透明的。如果他们唯一标识一个资源,那么您不必过于担心使您的URL看起来漂亮。我并不是说资源建模并不重要,但IMO不应该花太多时间在其上。如果您的企业需要直接在库存和个人账户下进行指导,那就这样吧。

+1

W3C TAG已经推荐只有一个URL应该返回资源。其他引用该资源的URL应该重定向。 http://www.w3.org/2001/tag/issues.html#httpRange-14 –

1

您是否担心这会造成数据泄露给未授权用户?或者你的关注纯粹是设计驱动的?

如果您不关心安全问题,我同意让2个URIS指向相同的资源是完全正确的。

2

我认为有两个URI指向相同的项目是在寻求麻烦。根据我的经验,当您向外扩展(缓存,群集中的多个节点不同步等)时,这些事情会导致疯狂。只要该项目的ID确实是全球唯一的,就没有理由不简单地将其称为/inventory/uid