在我们的系统中,我们有包含项目的帐户。项始终与单个帐户关联,但在系统中也具有全局唯一ID。有时,当只知道其id时,需要使用项目。
允许从其所有者(帐户)外部访问下级资源(项目)是否不正确?换句话说,对同一资源有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
答案 0 :(得分:2)
我认为有两个URI指向同一个项目是在寻找麻烦。根据我的经验,当你向外扩展时,这些东西会导致疯狂(缓存,群集中的多个节点不同步等等)。只要该商品的ID确实是全球唯一的,就没有理由不将其简称为 / inventory / uid
答案 1 :(得分:1)
换句话说,对同一资源有2个URI是错误的吗?
没有。让多个URI标识相同的资源并没有错。我也没有看到你的第一种方法有什么问题。记住URI是唯一标识符,对客户端应该是不透明的。如果他们唯一地识别资源,那么您不必过于担心使URL看起来漂亮。我不是说资源建模不重要,但IMO我们不应该花太多时间在它上面。如果您的业务需要您直接在库存下以及个人帐户下使用guid,那就这样吧。
答案 2 :(得分:1)
您是否因为在未经授权的用户可以使用数据方面存在安全漏洞而对此感到担忧?或者您的关注纯粹是设计驱动的?
如果您不担心安全性,我同意让2个URIS指向相同的资源是完全没问题的。
答案 3 :(得分: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,可能会出现类似的问题。重定向保持更清洁(不完全同步,但更清洁)。
是否使项目从属于帐户取决于项目是否可以在没有帐户的情况下存在。如果项目的数据是帐户数据的子集,则继续并使其从属。如果您发现某个帐户只是一种容器,或者某些项目没有任何容器,则将它们提升到最高级别。