如何在不使用唯一标识符的情况下访问 REST API 中的子资源?

How to access a Subresource in a REST API without using the unique identifier?

我需要访问资源的子资源而不使用该资源的真正唯一标识符。

据我了解,您使用 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:

The query component is indicated by the first question mark ("?") character and terminated by a number sign ("#") character or by the end of the URI.

因此,您不能使用查询(或 RFC1738 中的前一个术语“searchpart”)并以 / 结尾。

更合适的方式是:

/cars/engine/name?carColor=red

“我如何使用资源的多个属性作为唯一标识符?”

有 2 个选项(可能更多):

  1. “将它们链接在一起”,使用您自己的单独规则。如:/persons/Joe_SP_Watson_SP_Spain
  2. 使用您提到的查询。比如/persons?firstname=Joe&sirname=watson&country=spain

个人更喜欢第二种方案,更容易理解,也更容易维护。