RESTful API设置排序顺序

我们有一个带有/ 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

denny88613 回答:RESTful API设置排序顺序

这是我的习惯。

我正在使用相对变化值来更改序列。

在HTTP请求中:

PATCH /buttons/:buttonId/sequence?deviceId=:deviceId

{ "$change": n }

n可以是任何整数或+/- 'INFINITY'

请注意,查询部分将成为您订购的范围。

然后在服务器中,在以下情况下,我需要更改此字段:

  • 如果n是数字,请按+/- 1的顺序更新所有n项的顺序,并更新+/- n的:buttonId项。加/减基于方向。
  • 如果n是+/- 'INFINITY',则表示您要将其放在顶部或底部。然后获得范围中的最大/最小顺序,正负1将是您要设置的值。

这些情况中的任何一种都将执行不超过2个SQL查询(不包括SELECT)。

您可以在我的JS代码中找到大多数逻辑作为参考:ModelService.js of mytharcher/exprest

本文链接:https://www.f2er.com/3139242.html

大家都在问