我有一个对象层次结构,需要通过RESTful API公开,但我不确定URL应该如何构建以及它们应该返回什么。我找不到最佳实践。
假设我有从动物继承的狗和猫。 我需要对狗和猫执行CRUD操作; 我还希望能够对一般动物进行操作。
我的第一个想法是这样的:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
问题在于/animals集合现在是“不一致的”,因为它可以返回和获取结构不完全相同的对象(狗和猫)。如果一个集合可以返回具有不同属性的对象,这是否被认为是“符合REST原则”的?
另一种解决方案是为每个具体类型创建一个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
在这种情况下,返回的动物仅包含所有动物共有的属性,舍弃了狗和猫特有的属性。这样可以检索到所有动物,但细节会减少。每个返回的对象都可以包含到详细、具体版本的链接。有任何评论或建议吗?
GET /animals - 获取所有的狗和猫
GET /animals/dogs - 获取所有的狗
GET /animals/cats - 获取所有的猫
- dipoldGET /animals
接受application/vnd.vet-services.animal.dog+json
。 - BrianT.POST
操作呢?因为大多数框架无法从Json中获取好的类型信息,所以无法正确地将其反序列化为模型。比如,对于以下的请求数据[{"type":"dog","name":"Fido","playsFetch":true},{"type":"cat","name":"Sparkles","likesToPurr":"sometimes"}]
,你该如何处理? - LB2