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

时间:2019-06-18 15:47:07

标签: rest api http uri api-design

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

据我了解,您使用Path-Variables作为唯一标识符,并使用Request-Params进行过滤。

如果我要使用唯一标识符,则URI可能如下所示:

/cars/47/engine/name

但是,如果我想通过汽车的颜色获得汽车发动机的名称,我不确定该怎么做。由于颜色将成为过滤器,因此查询必须看起来像这样:

/cars?color=red/engine/name

但这对我来说有点奇怪,或者这实际上是常规的做法吗?

此外,我将如何使用资源的多个属性作为唯一标识符?想象我有一个应用程序,可以通过它的名字,姓氏和该人的出生国家来识别一个人。我可以这样将他们链接在一起吗?

/persons/JoeWatsonSpain

或者我不能将其用作真正的唯一标识符并改为执行过滤器逻辑吗?

/persons?firstname=Joe&sirname=watson&country=spain

1 个答案:

答案 0 :(得分:0)

“但是,这对我来说(/cars?color=red/engine/name)有点奇怪,或者这实际上是常规的做法吗?”

不。此API设计不正确。根据{{​​3}}:

  

查询组件由第一个问号(“?”)字符指示,并由数字符号(“#”)字符或URI末尾终止。

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

更合适的方式是:

/cars/engine/name?carColor=red

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

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

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

我个人而言,我更喜欢第二种解决方案,该解决方案更易于理解和维护。