rest - 使用 REST API 更新嵌套对象
问题描述
我有资源Student
和 4 个 API 端点:
POST: /students
GET: /students/{id}
PUT: /students/{id}
DELETE: /students/{id}
现在,我想将新属性Address
作为对象添加到Student
:
class Student
{
public int Id;
public string Name;
public Address Address;
}
Address
也具有Street
作为对象的属性。
我的问题是,如果我只想更新address
or street
,最好是:
- 使用更新学生 API:提供所有学生属性,即使它们没有更改
- 创建新的端点
PUT: /students/{id}/address
和PUT: /students/{id}/address/street
解决方案
这取决于您希望 API 对客户端有多友好。我最近看到了一个返回对象的 API,但是为了更新对象中的单个字段,客户端必须调用另一个端点来获取额外的信息以添加到原始对象中,以便 PUT 更新的对象。我认为那是客户不友好的。
如果客户端GET
saStudent
并且他们获得了完整的对象Id
, Name
, Address
,Street
那么我希望PUT: /students/{id}
能够处理完整的对象,更新与数据库中的字段不同的字段或存储对象的任何位置。如果 API 给客户端一个完整的对象,那么 API 应该是客户端友好的,并且能够接受一个完整的对象,而不是让客户端解构对象。
如果API首先给客户端一个完整的对象,我不希望客户端必须从 中提取Address
,Student
然后Street
从地址中提取并将其发送到。PUT: /students/{id}/address/street
Student
这种方法的唯一缺点是带宽。如果 Street 中的单个字母发生更改,则客户端必须更改PUT
整个Student
对象。所以这真的取决于客户端是什么以及它在什么网络上运行。互联网上的 REST 客户端?接受完整的对象。资源受限设备上的嵌入式客户端?它可能需要发送对象的片段,但这会导致与Student
对象层次结构匹配的 REST 端点,这对我来说是紧密耦合的,并不推荐。