具有多租户和共享资源的RESTful API



我正试图为一个支持多租户和共享资源的应用程序找到url结构的"正确"实现。

资源:用户,项目

URL模式是

host/api/tenant_id/resource[/id][/subresource][/id]

用户A(width id=1)在上获得他的项目集合

GET http://example.com/api/1/projects/

用户A创建一个新项目,可以读取

GET http://example.com/api/1/projects/2

现在,用户A授予另一个用户B(id=2)访问项目2的权限。用户B希望通过查看与其帐户相关的所有项目的集合

GET http://example.com/api/2/projects/

除了用户B自己创建的项目之外,共享项目(id=2)是否应该在这个集合中?或者共享资源有更好的命名结构吗?

对于RESTful架构来说,专注于URL结构的设计实际上是行不通的。Roy Fielding:

REST API不能定义固定的资源名称或层次结构(客户端和服务器的明显耦合)。

另请参阅此答案。

对于您的特定问题,我会返回一个用户可以访问的项目的(基本上是任意的)超文本链接列表。这些链接将包含明确的属性,无论该项目是用户"拥有"还是"可访问"。为了提高可读性,您可以将资源URL设计为

http://example.com/user/{user id}
http://example.com/project/{project id}

GET之后的用户表示http://example.com/user/2将包含类似的链接列表

<a href="http://example.com/project/1" class="owned"/>
<a href="http://example.com/project/2" class="access-permitted"/>

HAEOAS原则是REST固有的,它使大多数"我如何设计URI"问题过时:

其原理是客户端完全通过应用程序服务器动态提供的超媒体与网络应用程序进行交互。REST客户端不需要事先了解如何与任何特定的应用程序或服务器交互,而只需要对超媒体有一般的理解。

也许一个优势是在路径中使用租户信息。通过这种方式,我们可以很容易地获得例如对象列表。查询get/trent-id/projects的uri我们可以为每个租户提供项目列表。如何在没有租户信息的情况下获取url?

我的2美分

最新更新