所以我和我的老板不同意这里,也找不到任何相关信息。场景:我想获得某个组织的所有用户。 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/
。
答案 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 question或this 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。认为它是一个文件夹。
你像程序员一样看待它,就像它是SOAP或PHP函数一样,尝试制作getUsersByOrganization($orgId)
而这不是REST的工作方式。 :)
如果您必须坚持使用案例1(第一个URI段=返回类型),请执行以下操作:
完全是RESTful,它本质上只是一个过滤器。你甚至可以做到这两点,但我不会。这是一种没有地方的关系。我尝试将过滤器保存在以下内容中:?active = true
答案 4 :(得分:0)
第二个更好。沿着URI向下移动应该缩小请求,作为过滤器或显示父子对象。用户属于组织,因此应该是组织/用户。但是,如果可能的话,我也会摆脱URI的“组织”级别。
mydomain.com/{orgId}/users
答案 5 :(得分:0)
通过REST,URI结构仅从人的角度来看才有意义。从REST客户端的角度来看无关紧要,因为它遵循带语义的注释链接。
要回答您的问题,您要描述的是什么,关系或用户。如果要添加和删除关系,则必须定义关系集合。如果要添加和删除用户,则必须定义用户集合。这只是通过操纵来解决的。通过GET,您可以定义任何类型的查询,返回一堆用户......