REST API 命名约定:使用嵌套路径引用唯一资源
REST API naming convention: referencing unique resources with nested paths
鉴于user
s和comment
s之间存在一对多关系,并且提供的所有id都是唯一的;
将操作命名为:
有什么注意事项
DELETE /users/{user_uuid}/comments/{comment_uuid}
或
DELETE /comments/{comment_uuid}
?
在前者中 user_uuid
是多余的,因为不需要删除评论。是否值得保留 user_uuid
只是为了使 url 看起来 RESTful?
两者都适用于结构良好的 RESTful 资源——只要 comment_uuid
确实是一个 uuid。既没有暗示底层实现,也没有让我尖叫 this is an RPC service
:)
无论您选择什么,规则 #1...保持一致。
也就是说,我更喜欢第一个,因为它加强了语义信息,即这是 user
评论。我可以看到这一点,并且几乎知道我要返回什么,而无需提出请求。
评论不适合显示反例,因为大多数评论来自用户,但考虑一下......可以想象,你可以有一些其他类型的实体留下评论,想象一下在你的系统中注册机器人/bot/{bot_uuid}
、
现在,如果您只选择 /comment
,您是否只是删除了用户或机器人评论?
在扫描代码时将此与 /bot/{bot_uuid}/comment/{comment_uuid}
进行比较。越详细越清晰IMOP
最后,如果有人为特定评论提供获取请求 /users/{user_uuid}/comments/{comment_uuid}
我知道用户的 URL,只需删除评论部分。当然,大多数人可能会猜到,/user/{user_uuid}
,但就像我说的,用户和评论是不好的例子,因为你得到更多的非典型资源名称,它变得不那么明显。问题是如果你总是明确的,当资源如下所示时你不必担心:
/widget/{widget_uuid}/contrawidget/{co_uuid}/parts/{part_uuid}
/spaceframe/{spaceframe_uuid}/parts/{part_uuid}
现在你只做部分:
/parts/{part_uuid}
可能不会,因为它可能会让消费者感到困惑
我认为你的问题是设计问题,而不是@ray 所说的 RESTful 问题,就像所有设计问题一样,答案是......取决于。
我也更喜欢第一个,因为没有用户就无法存在评论(据我所知是评论)。
但对于这类问题,我使用 Entity-Control-Boundary Pattern (EBC) 它基本上提出了一种在某些实体的上下文中与您的应用程序交互的形式,而不是使用系统的所有实体,仅使用关键实体,我通常将此作为我的规则来识别更有意义的路径。
Is it worth keeping user_uuid just to make the urls looks RESTful?
没有。通过使标识符看起来 RESTful 获得的商业价值与零没有区别。
您可能出于其他原因这样做:URI 设计主要是为了让事情对人类更容易。就机器而言,所有的 URI 都可以是没有其他提示的 UUIDS。
也就是说,有一些重要的事情需要考虑....
/users/{user_uuid}/comments/{comment_uuid}
/comments/{comment_uuid}
这些是不同的标识符;因此,就客户端而言,它们是不同的资源。这意味着,就客户端而言,它们是单独缓存的。 Invalidating one 不会使另一个无效。
(当然,其他客户端不知道发生了 DELETE,将继续使用 两个 资源的缓存副本。缓存失效是两个难题之一)。
鉴于user
s和comment
s之间存在一对多关系,并且提供的所有id都是唯一的;
将操作命名为:
有什么注意事项DELETE /users/{user_uuid}/comments/{comment_uuid}
或
DELETE /comments/{comment_uuid}
?
在前者中 user_uuid
是多余的,因为不需要删除评论。是否值得保留 user_uuid
只是为了使 url 看起来 RESTful?
两者都适用于结构良好的 RESTful 资源——只要 comment_uuid
确实是一个 uuid。既没有暗示底层实现,也没有让我尖叫 this is an RPC service
:)
无论您选择什么,规则 #1...保持一致。
也就是说,我更喜欢第一个,因为它加强了语义信息,即这是 user
评论。我可以看到这一点,并且几乎知道我要返回什么,而无需提出请求。
评论不适合显示反例,因为大多数评论来自用户,但考虑一下......可以想象,你可以有一些其他类型的实体留下评论,想象一下在你的系统中注册机器人/bot/{bot_uuid}
、
现在,如果您只选择 /comment
,您是否只是删除了用户或机器人评论?
在扫描代码时将此与 /bot/{bot_uuid}/comment/{comment_uuid}
进行比较。越详细越清晰IMOP
最后,如果有人为特定评论提供获取请求 /users/{user_uuid}/comments/{comment_uuid}
我知道用户的 URL,只需删除评论部分。当然,大多数人可能会猜到,/user/{user_uuid}
,但就像我说的,用户和评论是不好的例子,因为你得到更多的非典型资源名称,它变得不那么明显。问题是如果你总是明确的,当资源如下所示时你不必担心:
/widget/{widget_uuid}/contrawidget/{co_uuid}/parts/{part_uuid}
/spaceframe/{spaceframe_uuid}/parts/{part_uuid}
现在你只做部分:
/parts/{part_uuid}
可能不会,因为它可能会让消费者感到困惑
我认为你的问题是设计问题,而不是@ray 所说的 RESTful 问题,就像所有设计问题一样,答案是......取决于。
我也更喜欢第一个,因为没有用户就无法存在评论(据我所知是评论)。
但对于这类问题,我使用 Entity-Control-Boundary Pattern (EBC) 它基本上提出了一种在某些实体的上下文中与您的应用程序交互的形式,而不是使用系统的所有实体,仅使用关键实体,我通常将此作为我的规则来识别更有意义的路径。
Is it worth keeping user_uuid just to make the urls looks RESTful?
没有。通过使标识符看起来 RESTful 获得的商业价值与零没有区别。
您可能出于其他原因这样做:URI 设计主要是为了让事情对人类更容易。就机器而言,所有的 URI 都可以是没有其他提示的 UUIDS。
也就是说,有一些重要的事情需要考虑....
/users/{user_uuid}/comments/{comment_uuid}
/comments/{comment_uuid}
这些是不同的标识符;因此,就客户端而言,它们是不同的资源。这意味着,就客户端而言,它们是单独缓存的。 Invalidating one 不会使另一个无效。
(当然,其他客户端不知道发生了 DELETE,将继续使用 两个 资源的缓存副本。缓存失效是两个难题之一)。