使用REST API更新嵌套对象

时间:2018-11-12 13:17:23

标签: 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作为对象。

我的问题是,如果我只想更新addressstreet,最好是:

  • 使用更新的学生API:即使没有更改,也要提供所有学生属性
  • 创建新的端点PUT: /students/{id}/addressPUT: /students/{id}/address/street

1 个答案:

答案 0 :(得分:1)

这取决于您希望该API对客户端友好的程度。最近,我见过一个API,该API返回一个对象,但是为了更新对象中的单个字段,客户端必须调用另一个端点以获取额外的信息以添加到原始对象中,以放置更新的对象。我认为这对客户不友好。

如果客户GETStudent,并且他们获得了完整对象IdNameAddressStreet,那么我期望PUT: /students/{id},以便能够处理完整的对象,并更新与数据库或对象存储位置不同的字段。如果API向客户端提供了完整的对象,则API应该对客户端友好,并且能够接受完整的对象,而不是让客户端解构该对象。

我不希望客户端必须从Address中提取Student,然后从地址中提取Street并将其发送到PUT: /students/{id}/address/street API首先为客户端提供了完整的Student对象。

此方法的唯一缺点是带宽。如果街道上的单个字母发生更改,则客户必须PUT整个Student对象。因此,这实际上取决于客户端是什么以及它在哪个网络上运行。互联网上的REST客户端?接受完整的对象。资源受限设备上的嵌入式客户端?它可能需要发送对象的片段,但这会导致与Student对象层次结构相匹配的REST端点对我来说是紧密耦合的,因此不建议这样做。