对于REST来说,为子资源拥有非唯一的ID是不好的吗?
例如,端点是:
GET /parent/:parent_name/child/:child_name
:parent_name
是唯一的,但是:child_name
只对该父程序是唯一的。
我决定一开始使用名称,因为parent
和child
是存在于外部系统中的资源。这将允许API使用者直观地将名称输入URI中,而不需要额外的查询就可以像GUID一样获得API特有的ID。
然而,我开始认为这可能是个错误。任何使用child
的端点现在都需要:parent_name
和:child_name
。child
是根的任何端点也需要查询参数中的:parent_name
,这给我带来了一种不好的感觉,我不知道这对于API使用者来说有多直观。
对于子资源,这种非唯一ID的设计是可以接受的,还是只在API中生成唯一ID并始终使用该ID更好呢?
发布于 2020-03-21 04:01:56
对于如何在REST中构建URL没有严格的规则,只有常识和最佳实践(例如,这里是一这样的指南,在很多方面都是如此)。从REST的角度来看,URL的外观并不重要。像/da39a3ee5e6b4b0d3255b
这样的东西只要标识资源就可以了。
在您的示例中,整个URL是任何特定点上的资源标识符(无论是实体集合还是单个实体的资源标识符)。因此,如果您可以正确地构建URL,这样就不会有可能导致一个标识符指向更多资源的重叠,那么无论您如何构建URL以及它们包含什么名称,您都应该没有问题。
尽管如此,如果您决定使用名称(您没有确切地提到这些名称所包含的内容,所以我将假设一些纯文本),但也存在一些问题。就像我说过的,REST不关心URL。我们为用户构建这样的用户友好URL。人们使用。机器不在乎。因此,如果您想要构建具有名称而不是in的URL,请将人员视为目标受众。例如,我的头顶:
出于这样的原因,这些人通常喜欢在那里贴一个身份证,然后就到此为止。有时他们甚至使用:ID-:Name
(即ID、破折号、名称)或:ID/:Name
(即ID、斜杠、名称)。ID由应用程序使用,而名称在那里是为了方便人们,而应用程序的实际执行/路由引擎忽略了ID。作为一个例子,查看这个实际的帖子并比较这两个URL:
这个应用程序查看帖子的ID,它是为人和搜索引擎优化之后的。
最后,这个问题没有明确的答案。就像我说的,只是常识和最佳实践。所以,运用常识,阅读一些最佳实践。我个人对此的回答是,由于我上面提到的问题,我尽量避免使用姓名。你可以把名字弄得乱七八糟,但用(通常是数字的)ID就不那么糟了。您的API将更容易使用ID而不是名称来发展。
https://softwareengineering.stackexchange.com/questions/406822
复制相似问题