我需要访问资源的子资源,而不使用该资源的真实唯一标识符。
据我了解,您使用 Path-Variables 作为唯一标识符,使用 Request-Params 进行过滤。
如果我使用唯一标识符,URI 可能如下所示:
/cars/47/engine/name
但是,如果我想通过汽车的颜色获取汽车发动机的名称,我不知道该怎么做。由于颜色是一个过滤器,因此查询必须如下所示:
/cars?color=red/engine/name
但这对我来说看起来有点奇怪,或者这实际上是传统的做法?
此外,我如何使用资源的多个属性作为唯一标识符?想象一下,我有一个应用程序,我可以通过名字、先生的名字和出生的国家来识别一个人。我会像这样将它们链接在一起吗:
/persons/JoeWatsonSpain
或者我不能将其用作真正的唯一标识符并执行过滤逻辑吗?
/persons?firstname=Joe&sirname=watson&country=spain
“但这对我来说看起来有点奇怪(
/cars?color=red/engine/name
)或者这实际上是传统的做法?”
不。这个API设计是不正确的。根据RFC3986:
查询组件由第一个问号(“?”)字符指示,并以数字符号(“#”)字符或 URI 的末尾结束。
因此,您不能使用查询(或 RFC1738 中的前一个术语“searchpart”)并以
/
结束。
更合适的方式是这样的:
/cars/engine/name?carColor=red
“如何使用资源的多个属性作为唯一标识符?”
有 2 个选项(也许更多):
/persons/Joe_SP_Watson_SP_Spain
/persons?firstname=Joe&sirname=watson&country=spain
我个人更喜欢第二种方案,更容易理解,也更容易维护。
但是如果我想通过汽车的颜色获取汽车发动机的名称...
当您使用
color=red
查询汽车时,您应该期望根据 REST 标准获得响应的资源(汽车)列表。
因此 GET /cars?color=red 应该返回 [car1, car2]。
为了解决您的问题,我会考虑不在服务器端创建一个单独的端点来获取匹配
color=red
的汽车的引擎名称,而是让客户端(浏览器应用程序、其他消费者)从返回的汽车列表中处理该端点:
GET /cars?color=red