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

具有多租户和共享资源的RESTful API,api,rest,url,restful-url,restful-architecture,Api,Rest,Url,Restful Url,Restful Architecture,我正试图为一个支持多租户和共享资源的应用程序找到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访问项目

我正试图为一个支持多租户和共享资源的应用程序找到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是否应该在该集合中?还是有更好的共享资源命名结构?

专注于URL结构的设计实际上是RESTful架构的禁忌。罗伊·菲尔丁:

RESTAPI不能定义固定的资源名称或层次结构—客户端和服务器的明显耦合

另见

对于您的具体问题,我将返回一个基本上任意的超文本链接列表,这些链接指向用户可以访问的项目。链接将包含明确说明项目是否由用户“拥有”或“可访问”的属性。为了提高可读性,您可以将资源URL设计为

http://example.com/user/{user id}
http://example.com/project/{project id}
GET之后的user表示将包含如下链接列表

<a href="http://example.com/project/1" class="owned"/>
<a href="http://example.com/project/2" class="access-permitted"/>
这一原则是REST固有的,并使大多数»我如何设计我的URI«问题变得过时:

其原理是客户端完全通过应用服务器动态提供的超媒体与网络应用程序交互。除了对超媒体的一般理解之外,REST客户机不需要关于如何与任何特定应用程序或服务器交互的先验知识


专注于URL结构的设计实际上是RESTful体系结构的禁忌。罗伊·菲尔丁:

RESTAPI不能定义固定的资源名称或层次结构—客户端和服务器的明显耦合

另见

对于您的具体问题,我将返回一个基本上任意的超文本链接列表,这些链接指向用户可以访问的项目。链接将包含明确说明项目是否由用户“拥有”或“可访问”的属性。为了提高可读性,您可以将资源URL设计为

http://example.com/user/{user id}
http://example.com/project/{project id}
GET之后的user表示将包含如下链接列表

<a href="http://example.com/project/1" class="owned"/>
<a href="http://example.com/project/2" class="access-permitted"/>
这一原则是REST固有的,并使大多数»我如何设计我的URI«问题变得过时:

其原理是客户端完全通过应用服务器动态提供的超媒体与网络应用程序交互。除了对超媒体的一般理解之外,REST客户机不需要关于如何与任何特定应用程序或服务器交互的先验知识


在路径中使用租户信息可能是一个优势。以这种方式,我们可以很容易地得到例如对象列表。 查询get/tenant id/projects上的uri 我们可以为每个入驻租户提供一份项目列表。 如果没有租户信息,如何获取url


我的2美分

在路径中使用租户信息可能是一个优势。以这种方式,我们可以很容易地得到例如对象列表。 查询get/tenant id/projects上的uri 我们可以为每个入驻租户提供一份项目列表。 如果没有租户信息,如何获取url


我的2美分

为什么您希望租户ID标识在不同租户下创建的项目?在应用程序中,资源比项目更多。我打算将租户作为API的入口点。因此id=1的用户A可以访问其所有资源。更准确地说,资源项目2现在可由用户A和用户B访问。是否正确,要在用户A和用户B的项目集合中同时显示项目2?为什么希望租户ID标识在不同租户下创建的项目?在应用程序中,资源不仅仅是项目。我打算将租户作为API的入口点。因此id=1的用户A可以访问其所有资源。更准确地说,用户A和用户B现在都可以访问资源项目2。在用户A和用户B的项目集合中显示项目2是否正确?这是有意义的。但是,将租户id作为入口点放在url方案中如何?由于应用程序应服务于多个租户,用户A在example.com/api/projects/上的资源与用户B不同。为什么要在example.com/api/projects上返回租户特定的项目?为什么不使用从example.com/api/user/1收到的项目列表?如果您使用另一个URI提供相同的信息,您还有什么额外的好处?如果您想提供一个»项目主列表«,其中包含拥有或允许访问该项目的链接资源的所有项目,则情况会有所不同。这是有意义的。但是,将租户id作为入口点放在url方案中如何?因为应用程序应该
多个租户,用户A在example.com/api/projects/上的资源与用户B不同。为什么要在example.com/api/projects上返回租户特定的项目?为什么不使用从example.com/api/user/1收到的项目列表?如果您使用另一个URI提供相同的信息,您还有什么额外的好处?如果您希望提供一个»项目主列表«,其中包含所有拥有或允许访问该项目的链接资源的项目,则情况会有所不同。我错误地将我的评论标记为community wiki。找不到如何取消标记。我错误地将我的评论标记为社区wiki。找不到如何取消标记。