api - 在 REST Api 调用中批量更新集合的最佳实践

标签 api rest api-design

<分区>

您好,我正在寻找 API 设计的最佳实践,以通过 API 调用批量更新集合。

我的收藏有 URL/api/v1/cars,我想更新收藏中的所有汽车以添加当前时间的时间戳。

{
    data: [
    {
        manufacturer: 'Porsche',
        timestamp: ...
    },
    {
        manufacturer: 'BMW',
        timestamp: ...
    }
    {
        manufacturer: 'Peugeot',
        timestamp: ...
    }
}

我考虑了几个选项,但我想不出什么是最佳做法。

应该是:

1/建模为另一个资源,例如 POST api/v1/cars/updateTimestamp

2/作为查询参数传递:PUT api/v1/cars?updateTimestamp

3/传入请求正文:

POST api/v1/cars 
{"operation":"Update timestamps"}

我想强调的是,整个处理应该在后端完成,而不是由客户端传递。 对于后端发生的任何复杂处理,都会发生同样的问题。 在这种情况下,我如何才能保留 API RESTy。

非常感谢您的帮助/任何指向相关资源的指针。

最佳答案

由于在 HTTP 中没有定义部分 PUT,您需要为每个资源发送整个实体以进行更新或使用一些其他操作。

发布

由于 POST 是一个通用操作,您可以使用它在服务器上创建一个短暂的临时资源(甚至不需要 own URL )。收到后,服务器可以使用某些提供的字段值组合更新所有指定的条目或一般的所有条目(尽管如果该列在关系数据库中尚不为人所知,则可能需要更改某些表)

一个简单的请求可能是这样的:

POST /api/v1/cars/addAttributes HTTP/1.1
Host: example.org
Content-Length: 24
Content-Type: application/json
If-Match: "abc123"

{
  "timestamp": "..."
}

这种方法的优点是它可以随时发送到服务器,即使事先不知道当前状态。然而,这也有某些条目被更新的危险,这些条目不应该受到影响。这可以通过指定 If-Match header 来影响,该 header 指向特定的版本哈希并在每次实体更新时更改,或者通过向 JSON 主体添加特定的限制器,服务器也必须明白。

补丁

类似于POST,可以向服务器发送任何内容,PATCH 用于修改资源。单个请求可能会同时更新多个资源,但是,客户端需要定义将资源从状态 A 转换为状态 B 的必要步骤。因此,客户端还需要拥有资源的最新状态才能成功将资源转换为其最新状态(-> ETag 和 If-Modified HTTP header )

A JSON Patch因此,对所提供示例的请求可能如下所示:

PATCH /api/v1/cars HTTP/1.1
Host: example.org
Content-Length: 215
Content-Type: application/json-patch+json
If-Match: "abc123"

[
  { "op": "add", "path": "/data/1", "value": [ "timestamp", "..." ] },
  { "op": "add", "path": "/data/2", "value": [ "timestamp", "..." ] },
  { "op": "add", "path": "/data/3", "value": [ "timestamp", "..." ] }
]

其中/data/1/data/2/data/3资源的唯一标识保时捷宝马标致

PATCH 指定请求必须是原子的,这意味着要么所有指令成功,要么全部不成功,这也为表带来了一些事务要求。

讨论

如前所述,在 POST 请求中,只要服务器能够理解您发送的内容,您就可以向服务器发送任何您想要的内容。因此,如何设计请求结构(以及服务器逻辑)取决于您。

另一方面,

PATCH,尤其是 JSON Patch 定义了一些严格的规则和预定义的操作,通常用于传统的修补。交易要求可能是一种负担,但也是一种好处。除此之外,PATCH 尚未最终确定并且仍在 RFC 中,尽管它已经广泛可用。

关于api - 在 REST Api 调用中批量更新集合的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36597768/

相关文章:

java - 除了方法之外还使用 header 将请求路由到带注释的方法

JavaScript 期间功能 : How do I setup a library like jQuery did

security - 保护/隐藏 Swagger/OpenAPI 规范文档是否合适?

javascript - 如何保护站点免受 API 中断的影响?

javascript - 如何知道查询中缺少哪些参数?

api - Facebook API、iFrame 中的 Canvas 应用、Javascript API、IE8 中的损坏?

ruby - 使用 HTTParty 发布大量数据

ruby-on-rails - 如何使用 Net::HTTP::Post 将 XML 发布到 RESTFUL Web 服务?

java - 定义使用 API 的规则的标准方法,也许是动态 UI

javascript - 在 Javascript 中使用 JSON 从 Google Search Ajax API 获取结果