我正在为我构建的一个小型SaaS重新设计REST API。目前有一条路由/entries
不需要任何身份验证。但是,如果客户端使用足够的权限进行身份验证,服务器将发送额外的信息(例如:与每个条目相关联的帐户)。
我看到的主要问题是,客户端试图以不足的权限请求受保护的数据仍然会收到200响应,但没有预期的数据,而不是401 Unauthorized。
我想到的替代方案是:
-
将端点拆分为两个端点,例如
/entries
和/admin/entries
。这种方法的问题在于,本质上相同的资源现在有两个不同的端点。然而,它的优点是易于用OpenAPI编写文档。(此外,它允许添加/entries/:id/account
端点。) -
接受查询参数
?admin=true
。这个选项更难记录。另一方面,它避免了对单个条目使用多个uri。
有一个标准的方法来构建这样的东西吗?
相关问题:相同资源的不同RESTful表示
请注意,就HTTP/REST而言,您的两个替代方案是相同的:在这两种情况下,您都引入了一个新的资源。我想到的替代方案是
在一种情况下,你使用路径段来区分两个标识符,在另一种情况下,你使用查询部分,这并不能改变你有两个资源的事实。
拥有两个具有相同信息的资源很好-想象两个基于相同信息构建的网页。
这是一种权衡——HTTP应用程序不知道这些资源有共同的信息,因此不知道使一个缓存资源无效也会使另一个缓存资源无效。所以就像网页一样,你可能会遇到缓存中的表示不一致的情况。
有时候,正确的答案是使用不同资源之间的链接——有"信息在一个地方,其他地方都有链接,让你找到那个地方。再次,权衡。
HTTP不是一个无限灵活的应用协议。它非常擅长通过网络传输文档,尤其是在"网络规模"下。
已经有人尝试使用链接头来触发其他缓存资源的无效,但据我所知,它们都没有通过提议阶段。