asp.net-web-api - API 更新对象属性中的数组:我们应该发送 id 数组还是完整对象?
问题描述
对于一个项目,我们有一个名为Item
.
这Item
有一个ID
,Title
和Description
。MediaFile[]
现在,我们有一个编辑功能,我们可以在其中更改标题、描述和添加/删除MediaFile
。添加 aMediaFile
是通过将文件发布到后端来完成的,后端返回 aFilename
和Id
。
当我们想要 PUT 更改Item
时,我们的后端想要一个不同的模型,只包含ID
,Title
和Description
一个包含 MediaFile id 的数组Guid[]
。MediaFile[]
这需要在我们的前端进行额外的“转换”,从Guid[]
. Item
发送完整的,更新的,因为我们首先使用 GET发送它不是更有意义吗?
简而言之:对于类中的集合,您应该发送完整的类数组还是只包含类的 id 的数组?
解决方案
我认为没有单一的观点,像往常一样,这是一种交易......一切都取决于您的需求和特定场景。一般来说,正如您所提到的,可以通过两种技术实现相同的结果:
- 将整个项目资源表示,包含引用的媒体文件集合到 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 }