我认为您可以使用 POST 或 PATCH 方法来处理此问题,因为它们通常为此设计。
我认为在这种情况下,POST 和PATCH 非常相似,因为您实际上不需要描述对每个元素执行的操作。我会说这取决于要发送的表示形式。
PUT 的情况不太清楚。事实上,当使用PUT 方法时,您应该提供整个列表。事实上,请求中提供的表示将替换列表资源之一。
关于资源路径,您可以有两种选择。
在这种情况下,您需要在请求中提供的表示中明确地提供带有活页夹的文档链接。
这是此/docs 的示例路线。
这种方法的内容可以是方法POST:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
此外,您还可以考虑利用子路由来描述文档和活页夹之间的链接。现在不必在请求内容中指定有关文档和活页夹之间关联的提示。
这是此/binder/{binderId}/docs 的示例路线。在这种情况下,如果文档不存在,则使用 POST 或 PATCH 方法发送文档列表将在创建文档后将文档附加到标识符为 binderId 的活页夹。
这种方法的内容可以是方法POST:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
关于响应,您可以定义响应级别和要返回的错误。我看到两个级别:状态级别(全局级别)和有效负载级别(更薄的级别)。您还可以定义与您的请求对应的所有插入/更新是否必须是原子的。
在这种情况下,您可以利用 HTTP 状态。如果一切顺利,您将获得状态200。如果没有,如果提供的数据不正确(例如 binder id 无效)或其他情况,则返回另一个状态,例如 400。
在这种情况下,将返回状态200,并由响应表示来描述已完成的操作以及最终发生错误的位置。 ElasticSearch 在其 REST API 中有一个用于批量更新的端点。这可能会给你一些关于这个级别的想法:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html。
您还可以实现异步处理来处理提供的数据。在这种情况下,HTTP 状态返回将是202。客户端需要拉取额外的资源来查看会发生什么。
在完成之前,我还想注意 OData 规范解决了有关实体之间关系的问题,该功能名为导航链接。也许你可以看看这个;-)
以下链接也可以帮助您:https://templth.wordpress.com/2014/12/15/designing-a-web-api/。
希望对你有帮助
蒂埃里