API更新对象属性中的数组:我们应该发送ID数组还是完整对象?

时间:2018-12-04 12:45:37

标签: asp.net-web-api put api-design httpverbs

对于一个项目,我们有一个名为Item的类。

Item具有IDTitleDescriptionMediaFile[]。现在,我们有了一个编辑功能,可以在其中更改标题,描述并添加/删除MediaFile。通过向后端发布文件来添加MediaFile,该文件将返回FilenameId

当我们想放置更改后的Item时,我们的后端希望有一个不同的模型,仅包含IDTitleDescription和一个包含MediaFile的数组id的Guid[]。这要求我们的前端从MediaFile[]Guid[]进行额外的“转换”。首先发送带有GET的完整更新的Item是不是更有意义?

简而言之: 对于类中的集合,您应该发送完整的类数组还是仅包含类ID的数组?

1 个答案:

答案 0 :(得分:0)

我认为没有单一的观点,像往常一样,这是一种交易……一切都取决于您的需求和特定情况。通常,正如您所提到的,可以通过两种技术来实现相同的结果:

  • 将整个项目资源表示形式放入其中,其中包含对API引用的MediaFiles的集合
  • 产生多个后端调用,每个后端调用都在Item资源和引用的Media文件之间创建链接。

前一种方法充当单个操作,可确保更高的一致性,但具有大量后端调用的所有缺点:如果失败,则很难确定整个请求是否失败或部分成功。此外,如果此批处理需要花费合理的时间-用户将一直处于阻塞状态,直到请求结束为止(我的意思是您无法使用进度报告来构建UI)。要么全有要么全无

一个字母(多个请求)会为关系添加单独的资源并产生额外的后端调用,但更易于使用,并且UI更具责任感。您可以通知用户批处理操作的状态和进度,此外,可以逐一处理失败(例如,应用一些重试策略)。

换句话说:

依赖资源方法:

PUT /items Body: {... MediaFile: [...]}

多次通话:

PUT /items Body: {...}
PUT /items/{itemId}/mediafiles/{mediaFileId} Body:{ ... MediaFileReosurse1 }
PUT /items/{itemId}/mediafiles/{mediaFileId} Body:{ ... MediaFileReosurse2 }
...
PUT /items/{itemId}/mediafiles/{mediaFileId} Body:{ ... MediaFileReosurseN }