从资源ID使用REST API终结点 让我们将下面的流程考虑到一个RestPress API: API root | v user list | v user details | v user messages

从资源ID使用REST API终结点 让我们将下面的流程考虑到一个RestPress API: API root | v user list | v user details | v user messages,api,rest,restful-architecture,Api,Rest,Restful Architecture,假设我有一个使用API的客户机,我想从ID为42的用户检索消息。 从我一直在研究的内容来看,我的客户机不应该知道如何“构建”URL,它应该遵循API提供的链接 我应该如何为ID为42的用户检索消息 我能想到的唯一方法是将整个API从根目录“遍历”到用户消息,这在我看来既不美观也不高效 例如: 1-获取/并获取用户列表的链接 2-获取/user/?id=42并获取id为42的用户详细信息的链接 3-获取/user/42/并获取指向user 42消息列表的链接 4-获取/user/42/messag

假设我有一个使用API的客户机,我想从ID为42的用户检索消息。 从我一直在研究的内容来看,我的客户机不应该知道如何“构建”URL,它应该遵循API提供的链接

我应该如何为ID为42的用户检索消息

我能想到的唯一方法是将整个API从根目录“遍历”到用户消息,这在我看来既不美观也不高效

例如:
1-获取/并获取用户列表的链接
2-获取/user/?id=42并获取id为42的用户详细信息的链接
3-获取/user/42/并获取指向user 42消息列表的链接
4-获取/user/42/messages/并最终获取用户消息

我做错什么了吗?根据罗伊的战地报告,这是正确的方法吗?
或者假设消息url为“/user/{id}/messages/”并直接发出请求就可以了吗?

我相信您真正关心的是是否应该开始实施。现在,由于它是REST规范不可分割的一部分,建议每个实体都有一个到它所包含的子实体的链接。在您的情况下,API ROOT应该显示用户列表,其中每个“用户”都有一个指向相应用户详细信息的链接(/ROOT/users/{id})。每个用户详细信息实体将包含指向“消息”列表的链接(/root/users/{id}/messages),最后,inturn还包含指向实际消息详细信息的链接(/root/users/{id}/messages/{messageId})。这个概念非常有用(因此也是规范的一部分),因为客户机不需要知道实体所在的url。例如,如果您的用户在{id}上,而您的消息在{userId}/messages/{messageId}上,则包含“消息”列表的用户实体将已嵌入指向其他服务器上正确资源的链接

话虽如此,实际上我还没有看到很多REST实现(我必须承认我没有太多的经验,但足以给出一个观点)在哪里HATEOAS被广泛使用。在大多数情况下,资源几乎总是在同一个服务器(环境)上,资源的路径几乎总是相对于根url。因此,当客户端可以自己生成一个嵌入链接时,客户端从对象解析出嵌入链接是没有意义的,特别是当客户端希望直接提供对资源的访问时(如果您已经知道messageId是什么,则直接查看消息而不获取用户实体)

最后,这完全取决于您希望REST实现与规范的实现有多接近,以及您将拥有什么样的客户机。我的2美分是:如果你有时间,用HATEOAS实现REST并为此感到自豪:)。有一些库将使这个实现(HATEOAS)对REST实现有点透明(我相信spring有一个,尽管不是很成熟。您可以看看它)。如果你和我一样,没有太多时间去做这件事,我认为你可以继续使用正常的REST实现,而不使用HATEOAS,你的客户仍然可以接受(或者我希望如此!)


希望这有帮助

在API根目录中使用URL模板。让客户端在运行时使用API根目录。它应该查找名为“user messages”的URL模板,其值为“/user/{userid}/messages/”。然后让客户端用模板中的“{userid}”替换“42”,并对结果URL执行GET。您可以为所有必需的、经常使用的用例添加任意数量的URL模板

此解决方案与“经典”web API之间的区别在于URL的后期绑定:客户端在运行时使用其模板读取API根,而不是使用URL模板的知识编译客户端

有关URL模板的一些信息,请查看HAL媒体类型:


不久前我在这里写了这篇文章来解释超媒体的好处:

我发现了这篇关于黑客URL的文章:。

在评论部分有一个关于这个问题主题的非常有趣的讨论。

为了简单起见,应该向REST API的使用者提供所需的API及其请求/响应结构。因此,他只关心如何渲染或以某种方式使用结果。此外,对于开发人员来说,在构建REST API时最好使用
HATEOAS
概念。非常喜欢你写的文章。谢谢