【问题标题】:REST: Updating multiple recordsREST:更新多条记录
【发布时间】:2014-03-04 05:03:40
【问题描述】:

我需要使用单个 HTTP 请求更新多条记录。一个示例是选择电子邮件列表并将其标记为“未读”。实现这一目标的最佳(Restful)方式是什么?

我现在的做法是,使用子资源操作

PUT http://example.com/api/emails/mark-as-unread

(在体内)

{ids:[1,2,3....]}

【问题讨论】:

  • 如果您不将此“全部更新”功能用于其他任何事情,我认为这是一个不错的选择,但如果您使用它,则创建另一个通过 ids 更新的路由,这就是我会做的。
  • 你的意思是像http://example.com/api/emails/bulk-update 然后传递一个对象数组?
  • 是的,类似的,选择最能描述您的功能的路线

标签: json api rest asp.net-web-api


【解决方案1】:

我阅读了这个网站 - http://restful-api-design.readthedocs.io/en/latest/methods.html#actions - 它建议使用“动作”子集合。例如

发布http://example.com/api/emails/actions

(在体内)

{"type":"mark-as-unread", "ids":[1,2,3....]}

引用网页的引述:

有时,需要在 API 中公开本质上非 RESTful 的操作。此类操作的一个示例是您要为资源引入状态更改,但是可以通过多种方式实现相同的最终状态,......一个很好的例子是“断电”之间的区别”和虚拟机的“关闭”。

作为此类非 RESTful 操作的解决方案,可以在资源上使用“操作”子集合。动作基本上是类似于 RPC 的消息,发送给资源以执行特定操作。 “actions”子集合可以看作是一个命令队列,可以向其发布新的操作,然后由 API 执行。 ...

应该注意,只有在有充分理由无法将操作映射到标准 RESTful 方法之一时,才应将操作用作异常。 ...

【讨论】:

    【解决方案2】:

    创建一个算法端点,比如

    http://example.com/api/emails/mark-unread
    

    bulk-update 是一个算法名称,一个名词。它成为 REST 中的端点名称,id 列表是该算法的参数。通常人们在POST 调用中将它们作为 URL 查询参数发送,例如

    http://example.com/api/emails/mark-unread?ids=1,2,3,4
    

    这是非常安全的,因为 POST 是非幂等的,您无需关心任何副作用。您可能会做出不同的决定,如果您的批量更新包含此类对象的完整状态,请选择 PUT

    http://example.com/api/emails/bulk-change-state
    

    那么您必须将实际状态放入 http 调用的主体中。 我更喜欢像mark-unread?ids=1,2,3,4 这样的简单算法,而不是一个单一的PUT,因为它有助于调试、日志透明等

    【讨论】:

    • 从我从其他人那里读到的关于 RESTful 的内容中,概念是所有 URI 都代表资源(即名词),URI 的任何部分都不应有动词。因此,引入“mark-unread”似乎不是 RESTful 方式。
    • @JohnnyWong 虽然它看起来确实是一个动词,但您可以将“标记未读”视为算法名称以避免混淆
    【解决方案3】:

    将模型数组作为参数放入动作方法中有点复杂。最简单的方法是从您的客户端形成一个 json 字符串并将所有内容发布到服务器(到您的操作方法)。您可以采用以下方法

    假设你的电子邮件模型是这样的:

    public class Email
    {
        public int EmailID {get; set;}
        public int StatusID {get; set;}
        // more properties
    }
    

    所以你的操作方法将采取以下形式:

    public bool UpdateAll(string EmailsJson)
    {
        Email[] emails = JsonConvert.DeserializeObject<Emails[]>(EmailsJson);
        foreach(Email eml in emails)
        {
            //do update logic
        }
    }
    

    使用 Json.NET 帮助进行序列化。

    在客户端你可以编写如下的ajax调用:

    $.ajax({
        url: 'api/emailsvc/updateall',
        method: 'post',
        data: {
            EmailsJson: JSON.stringify([{
                ID: 1,
                StatusID:2,
                //...more json object properties.
                },
                // more json objects
                ])
            },
        success:function(result){
            if(result)
                alert('updated successfully');
        });
    

    【讨论】:

      猜你喜欢
      • 2019-02-18
      • 2016-05-01
      • 2013-05-02
      • 1970-01-01
      • 2015-12-07
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多