我认为您可以使用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
。否则,如果提供的数据不正确(例如捆绑器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/。
希望能帮到你,
Thierry