首页 > 解决方案 > API 更新对象属性中的数组:我们应该发送 id 数组还是完整对象?

问题描述

对于一个项目,我们有一个名为Item.

Item有一个ID,TitleDescriptionMediaFile[]现在,我们有一个编辑功能,我们可以在其中更改标题、描述和添加/删除MediaFile。添加 aMediaFile是通过将文件发布到后端来完成的,后端返回 aFilenameId

当我们想要 PUT 更改Item时,我们的后端想要一个不同的模型,只包含ID,TitleDescription一个包含 MediaFile id 的数组Guid[]MediaFile[]这需要在我们的前端进行额外的“转换”,从Guid[]. Item发送完整的,更新的,因为我们首先使用 GET发送它不是更有意义吗?

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

标签: asp.net-web-apiputapi-designhttpverbs

解决方案


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

  • 将整个项目资源表示,包含引用的媒体文件集合到 API
  • 产生多个后端调用,每个调用在项目资源和引用的媒体文件之间创建链接。

前一种方法作为单一操作,保证更高的一致性,但具有大量后端调用的所有缺点:在失败的情况下,很难确定整个请求失败还是部分成功。此外,如果此批处理需要合理的时间 - 用户会一直被阻止直到请求结束(我的意思是您无法构建带有进度报告的 UI)。这是全有或全无的情况

字母一(多个请求)为关系添加单独的资源并产生额外的后端调用,但更加用户友好并且允许 UI 更加负责。您可以通知用户批量操作的状态和进度,并且对失败进行一一处理(rg应用一些重试策略)。

换句话说:

依赖资源方法:

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 }

推荐阅读