我有一个对象层次结构,我需要通过RESTful API公开,我不确定我的URL应该如何构建以及它们应该返回什么.我找不到任何最佳做法.
假设我有继承动物的狗和猫.我需要对狗和猫进行CRUD操作; 我也希望能够对动物进行一般操作.
我的第一个想法是做这样的事情:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
Run Code Online (Sandbox Code Playgroud)
问题是/ 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
Run Code Online (Sandbox Code Playgroud)
但现在狗和猫之间的关系就失去了.如果想要检索所有动物,必须查询狗和猫的资源.每个新的动物子类型的URL数量也会增加.
另一个建议是通过添加以下内容来扩充第二个解决方案:
GET /animals # get common attributes of all animals
Run Code Online (Sandbox Code Playgroud)
在这种情况下,返回的动物将仅包含所有动物共有的属性,丢弃特定于狗的属性和特定于猫的属性.这允许检索所有动物,尽管细节较少.每个返回的对象都可以包含指向详细的具体版本的链接.
有什么意见或建议吗?