Restful API命名约定

时间:2014-06-04 12:46:05

标签: rest naming-conventions restful-architecture

所以我和我的老板不同意这里,也找不到任何相关信息。场景:我想获得某个组织的所有用户。 URL应该是什么?

mydomain.com/users/by/organisation/{orgId}

OR

mydomain.com/organisation/{orgId}/users

我们的论点:

案例1:预期呼叫将返回“用户”,因此“资源”(呼叫的第一部分)应与之相关。

案例2:组织“拥有”/“是用户的父母,因此组织应该是第一个。

你有什么想法?

更新 我不担心mydomain.com/{resource}之后会发生什么。问题主要涉及HTTP操作(GET,POST,PUT,DELETE)是否应该与第一个资源mydomain.com/users相关,或者它是否应该反映关系mydomain.com/organisations/users/

6 个答案:

答案 0 :(得分:18)

你可能已经意识到REST没有严格的规则,你或多或少可以自由地实现它,但是这是我的2美分

mydomain.com/users/by/organisation/{orgId}

然而,这听起来像是一个很好的网址,因为它通过阅读它告诉你它做了什么,这不是一个好主意。通常,每个网址段指定一个存在或可以存在的资源

在这种情况下,users代表一个或多个资源,organisation也是如此,但by没有,它可能只是一个词,以帮助澄清什么API确实如此。

  

预计电话将返回"用户"因此"资源" (电话会议的第一部分)应与之相关。

资源不一定在网址的第一部分中指定。如果你想要它可以是第2,第3或第10个


mydomain.com/organisation/{orgId}/users

这看起来好多了,但我认为有一点改进。您应该将organisation重命名为organisations,以匹配users

mydomain.com/organisations/{orgId}
然后

获取ID为orgId

的组织
mydomain.com/organisations/{orgId}/users

获取属于该组织的所有用户。

为了进一步缩小范围,你可以做到

mydomain.com/organisations/{orgId}/users/{userId}

获取属于某个特定组织的特定用户


  

更新:我不担心之后会发生什么   mydomain.com/{resource}。 问题主要与是否有关    HTTP操作(GET,POST,PUT,DELETE)应与第一个相关   资源 mydomain.com/users或是否应该反映出来   关系mydomain.com/organisations/users /.

要回答您的更新:

我已在上面提到过; 资源不一定在网址的第一部分中指定。。如果通过将所需资源转移到网址的后面来提高网址的质量,请继续执行此操作

答案 1 :(得分:6)

您要在此处展示的内容之间存在概念上的差异。第一种是基于某些标准过滤系统中的所有用户资源。第二个是显示属于组织的用户资源。

第二个网址可以显示属于我认为的组织的用户。

第一个网址有效地过滤了您想要从所有用户看到的用户。

使用url对于过滤可能没问题,但是使用url querystring也可以。所以

mydomain.com/users?organisationId={orgId}

可能更好。网址仍然可以包含查询字符串并保持安宁。

DELETE mydomain.com/users/organisation/{orgid}真的有意义吗?您希望删除该组织吗?如果没有,那么这并不是真正指向一个资源,所以你正在进行搜索,并且应该使用查询字符串。

进行搜索还有其他选项,例如将搜索条件设为第一类对象,或使用this questionthis question中的其他过滤技术

答案 2 :(得分:6)

让我从这开始:从技术上讲,它应该不重要。 REST声明URL必须通过链接发现,例如普通(HTML)网页中的链接。

然而,一致的,不言自明的URL结构根本不会造成伤害。我建议在URL中使用层次结构:

  • /organisations返回所有组织的列表
  • /organisations/123返回特定组织(#123)
  • /organisations/123/users返回与该组织关联的用户列表

另一种方法是使用查询字符串进行过滤:

  • /users返回所有用户的列表
  • /users?organisation=123返回与该组织关联的用户列表

从这种等级角度来看,/users/by/organisation/123没有多大意义。调用/users/by/organisation会导致什么结果?或/users/by

答案 3 :(得分:2)

  

mydomain.com/users/by/organisation/ {ORGID}

" by"意思?这与任何事都没有关系。尝试keep random words out of the URL

  

案例1:预计电话将返回"用户"因此"资源" (电话会议的第一部分)应与之相关。

这不是RESTful API强制执行或期望的规则。它在行业中也不常见,而且我使用过LOOOT API。认为它是一个文件夹。

  • / users - 用户列表
  • / users / 1 - ID为1的用户
  • / users / 1 / organizations - 用户所属的组织
  • / organizations - orgs列表
  • / organizations / 1 - 组织编号1
  • / organizations / 1 / users - 该组织的用户

你像程序员一样看待它,就像它是SOAP或PHP函数一样,尝试制作getUsersByOrganization($orgId)而这不是REST的工作方式。 :)

如果您必须坚持使用案例1(第一个URI段=返回类型),请执行以下操作:

  • /用户?ORGID = 1

完全是RESTful,它本质上只是一个过滤器。你甚至可以做到这两点,但我不会。这是一种没有地方的关系。我尝试将过滤器保存在以下内容中:?active = true

答案 4 :(得分:0)

第二个更好。沿着URI向下移动应该缩小请求,作为过滤器或显示父子对象。用户属于组织,因此应该是组织/用户。但是,如果可能的话,我也会摆脱URI的“组织”级别。

mydomain.com/{orgId}/users

答案 5 :(得分:0)

通过REST,URI结构仅从人的角度来看才有意义。从REST客户端的角度来看无关紧要,因为它遵循带语义的注释链接。

要回答您的问题,您要描述的是什么,关系或用户。如果要添加和删除关系,则必须定义关系集合。如果要添加和删除用户,则必须定义用户集合。这只是通过操纵来解决的。通过GET,您可以定义任何类型的查询,返回一堆用户......