【问题标题】:A RESTful way of updating all the resources一种更新所有资源的 RESTful 方式
【发布时间】:2023-03-12 13:58:01
【问题描述】:

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

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

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

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

更新 1:

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

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

【问题讨论】:

  • this。我建议你使用带有列表的 PATCH 方法。
  • 请看我的更新。
  • 我仍然认为我的回答是正确的。你不想改变学生,你想改变班级。
  • 但这并不全面;例如,您如何使用该方法将每个学生的姓氏设置为空字符串?

标签: c# rest api asp.net-core


【解决方案1】:

使用 PATCH。 参考RFC5789RFC6902 了解更多详情。

示例:

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

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

  • 对于 atomic,失败的行将使您的整个请求 400
  • 对于非原子,您将获得来自服务器的 200,其正文中包含错误详细信息。

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

更新 1:

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

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

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

【讨论】:

  • 您仍然依赖classes,但在我的情况下,可能存在我没有class 的任何同义词的情况(例如,name 在我的问题中,必然存在没有模型)。
  • @Hamed 我使用classes 作为示例来解决您想为班级中的所有学生设置通用课程的问题。您实际上可以将此方法用于任何集合。至于您提到的name,我看到您为每个项目分配了不同的名称,但我从您的问题中了解到您想将所有资源的一个字段更新为一个共同值?我在这里有点困惑。
  • 是的,我想将所有资源的一个字段更新为一个共同的值。
  • @Hamed 如果是这样,那么我提供的解决方案基本上就是这样。只需指定您想要的值并将它们修补到集合中。我提供的示例将更新 123 班内的每个学生,以将他们的 courses 更新为请求正文中提供的公共值。如果您想为每个学生指定它,而不管他们的班级如何,您可以从 URL 中删除 classes。我不明白你为什么首先提到classes
【解决方案2】:

如果学生已经被分配到一个班级,那么我认为将他们整体更改为以下内容没有问题:

/api/class/123/updateCourse?newCourse=456

class ClassController
{
   public IResult UpdateCourse(int class, int newCourse)

【讨论】:

    【解决方案3】:

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

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

    接下来你只需要妥善处理它。例如,只需编写如下 SQL 查询:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多