在REST api中表示超类型的最佳方法是什么?

时间:2012-10-22 13:25:48

标签: rest hateoas

让我们考虑一下动物园的api,../api/zoos一直到访问某个动物园中的个体动物,例如../api/zoos/123/elephants/234,即每种动物类型都有明确定义的api。
现在,如果我们想要在超类型(抽象类Animal class Elephant extends Animal)中进行查询,那么为这样的元查询公开排序../api/zoos/123/animals?type="mammal"&legs=4的api是一个好主意吗?
让我对这种方法三思而后行的是,虽然超类型api对于跨具体类型的元查询几乎是有用的,但这实际上是一个只读查询,从可扩展性的角度来看,在超类型动物和具体类型之间说大象可以有很多其他类型,如Mammal,FourLegged等可以单独查询,然后需要调用是否只需要在这些上显示只读api,或者我们在动物查询中有一个类型参数做的工作。请建议。

1 个答案:

答案 0 :(得分:0)

每种动物都有独立的身份证吗? 我的意思是,是否有大象ID = 4和老虎ID = 4?

如果没有,我会将其结构为/zoos/123/animals/234

然后,您可以/zoos/123/animals?species=elephant列出所有大象,然后返回一系列ID可能看起来有点随机的链接:{ /zoos/123/animals/5, /zoos/123/animals/19, /zoos/123/animals/34, /zoos/123/animals/35, /zoos/123/animals/72 }

如果您<物种上确实存在冲突ID ,那么我建议您创建动物ID与物种ID的新资源映射:

+----------------------------+
|animal_id|species|species_id|
+----------------------------+
|       1 |  duck |        1 |  => the first duck is /animals/1
|       2 |  frog |        1 |  => the first frog is /animals/2
+----------------------------+

然后您仍然可以使用网址结构/zoos/123/animals/234。您无需将青蛙称为/frogs/1,因为/animals?order=anura&page=1&limit=10这样的页面会直接为您提供/ animals / 2

的链接

总之, ID属于您的超类