一种更新所有资源的 REST 方法



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

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

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

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

更新 1:

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

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

使用 PATCH。有关更多详细信息,请参阅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 ] }

如果学生已经被分配到一个班级,那么我认为用这样的东西来整体地改变他们没有问题:

/api/class/123/updateCourse?newCourse=456
class ClassController
{
public IResult UpdateCourse(int class, int newCourse)

您仍然可以像/items/update/all 一样创建一个端点并传递您的值:

POST /api/items/update/all 
{
"value": 123
}

接下来,您只需要正确处理它。例如,只需编写 SQL 查询,如下所示:

UPDATE Items
SET value=POST["value"];

最新更新