首页 > 解决方案 > 一种更新所有资源的 RESTful 方式

问题描述

我想对 API 公开的所有资源进行共同更改。例如,假设一个 API 公开了一个班级的所有学生,并且您想为所有学生设置一门通用课程。

一种方法是查询 API,并逐个或批量更新资源的属性。但是,这需要首先获取所有资源,然后更新它们的属性,然后发送和发布请求。

相反,我对 RESTful 设计感兴趣,您可以在其中发送属性及其值,这些属性将应用于通过 API 公开的所有资源(例如,前面示例中的学生)。

关于如何通过 RESTful 设计实现这一点的任何建议?

更新1:

换句话说,我想将所有资源的一个字段更新为一个共同的值,而不必先获取资源。因此,我不想实现以下内容,因为我有数百万个资源,我不想先获取它们的所有 ID,然后创建一个 json 对象,如下所示:

PATCH /items
[ { id: 1, name: 'foo' }, { id: 2, name: 'bar' } ]

标签: c#restapiasp.net-core

解决方案


使用补丁。有关详细信息,请参阅RFC5789和RFC6902

样本:

PATCH /api/classes/123/students
[ { id: 1, name: 'foo' }, { id: 2, name: 'bar' } ]

您将不得不选择如何处理您的响应错误,无论是否是原子的。

  • 对于原子,失败的行将发出您的整个请求400
  • 对于非原子,您将从200服务器获得其正文中的错误详细信息。

从 API 消费者的角度来看,这两种情况各有利弊。应根据您的用例做出决定。

更新1:

通过不向没有特定 ID 的端点提供列表,您正在对整个集合执行该操作。

提供这样的 JSON 主体应该将所有提供的属性设置为为该集合中的每个记录指定的值:

PATCH /api/classes/123/students
{ courses: [ commonCourse1, commonCourse2 ] }

推荐阅读