我们有一个带有/ devices和/ buttons的RESTful API,而一个设备可能具有0到ca的值。 1000个按钮。请求GET / devices / {deviceId} / buttons因此实现了分页(带有startIndex和limit)。 每个按钮都有一个sortSequence属性,该属性是一个数字。必须根据此属性对按钮进行排序(与字母名称或其他没有任何关系,按钮的选择取决于最终用户的意愿,只需拖放列表即可)。
问题是,如何处理sortSequence的修改?现在我们将其放在PUT / devices / {deviceId} / buttons / {buttonId}有效负载中:[...和新序列]。但是其他按钮呢?例如。如果我们有四个具有序列1,2,3,4的按钮,并且用户将最后一个按钮拖放到第一个位置,则不会发生任何变化,而是会发生以下几种变化:4-> 1、1-> 2、2-> 3,3-> 4。
谁负责后续更改,客户端还是服务器?
如果是客户,则:
- 通过一次拖放,客户端可能必须发送数百个 REST调用以修改 之间的所有按钮的顺序
- 由于存在分页,因此客户端无法创建新按钮 查询所有这些,因为它需要知道最高的顺序
如果是服务器,则:
- 对一个资源(按钮)进行PUT更新会更新其他许多按钮, 我认为这违反了REST原则。此外,它还会为每个按钮触发一系列Web套接字更新事件,这会降低UI速度。
- 如果创建/修改/删除 按钮请求即将到来,并且序列在 中间被修改后,服务器应并发运行 异常,当多个并行请求线程将尝试更新时 相同的对象可能具有不同的值
当然,无论是谁做的,如果几乎同时在两个客户端上创建了一个按钮,则该序列可能会自身重复。
这两种方法似乎都非常糟糕且存在问题。那么,有没有一种公认的最佳实践来处理这种修改?
基础结构:.net核心服务器,signalR,Web / iOS / Android客户端,ms sql db