我有一个需要通过 RESTful API 公开的对象层次结构,但我不确定我的 URL 应该如何构建以及它们应该返回什么。我找不到任何最佳做法。
假设我有继承自 Animals 的 Dogs 和 Cats。我需要对狗和猫进行 CRUD 操作;我也希望能够对一般动物进行手术。
我的第一个想法是做这样的事情:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
问题是 /animals 集合现在“不一致”,因为它可以返回和获取不具有完全相同结构的对象(狗和猫)。拥有一个返回具有不同属性的对象的集合是否被认为是“RESTful”?
另一种解决方案是为每个具体类型创建一个 URL,如下所示:
GET /dogs # get all dogs
POST /dogs # create a dog
GET /dogs/123 # get dog 123
GET /cats # get all cats
POST /cats # create a cat
GET /cats/123 # get cat 123
但是现在狗和猫之间的关系已经失去了。如果要检索所有动物,则必须同时查询狗和猫资源。URL 的数量也会随着每个新的动物子类型而增加。
另一个建议是通过添加以下内容来增强第二个解决方案:
GET /animals # get common attributes of all animals
在这种情况下,返回的动物将仅包含所有动物共有的属性,删除特定于狗和特定于猫的属性。这允许检索所有动物,尽管细节较少。每个返回的对象都可以包含指向详细的具体版本的链接。
有什么意见或建议吗?