我有一个对象层次结构,我需要通过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)
在这种情况下,返回的动物将仅包含所有动物共有的属性,丢弃特定于狗的属性和特定于猫的属性.这允许检索所有动物,尽管细节较少.每个返回的对象都可以包含指向详细的具体版本的链接.
有什么意见或建议吗?
我有一个具有User对象和Student对象的应用程序.有些用户是学生.所有学生都是用户.在数据库(基于django-ORM)中,这表示为具有Student表的外键的User表.
我正在尝试在iOS应用程序中创建一个REST API和一个对象层次结构来模拟这个API.我无法决定如何建模.
我提出的最好的是:User在iOS中有一个模型,在iOS中有一个Student模型,它继承User并扩展了更多的属性.然后,具有从该服务器接收的JSON响应,并创建一个方法或者一个User或一个Student模型,这取决于dictinoary.
最后,服务器需要始终为我提供最具体的类型.即,当我登录服务器时,它将决定我是学生还是普通用户,并将返回正确的字典.
这听起来有点复杂.但是我想到的任何其他方式建模它,例如改变数据库的布局方式,给了我一种设计,其中数据库不知道所有的约束.例如,Student允许对象拥有其他对象(例如,homework_paper).我可以用User对象的外键而不是对象来建模Student,并说它Student只是用户的扩展.但是,数据库并没有强迫a homework_paper必须由学生拥有.
有没有更好的方法来解决我错过的这个问题?