【问题标题】:RESTful API setting sorting sequenceRESTful API 设置排序顺序
【发布时间】:2019-11-08 08:49:37
【问题描述】:

我们有一个带有 /devices 和 /buttons 的 RESTful API,而一个设备可能有 0 到 ca。 1000 个按钮。因此,请求 GET /devices/{deviceId}/buttons 实现了分页(使用 startIndex 和限制)。 每个按钮都有一个 sortSequence 属性,它是一个数字。按钮必须根据此属性进行排序(与字母名称或其他无关,按钮根据最终用户的意愿在列表中拖放进行排序)。

问题是,如何处理sortSequence的修改?现在我们在 PUT /devices/{deviceId}/buttons/{buttonId} Payload: [... and new sequence] 中有它。但是其他按钮呢?例如。如果我们有四个序列为 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

【问题讨论】:

  • which I see as a violation of REST principles - 具体是哪些原则?
  • 嗯,REST 原则是相当可疑的,但我知道一个 REST 调用应该修改一个资源是普遍接受的。在其他情况下,如果它作为资源公开,它应该是对集合的操作。
  • 您可以实现按钮的链接列表(在存储层中)。但它可能会导致分页问题(取决于存储类型)。分页是必须的吗?如何在分页列表中实现拖放?你用什么来存储?
  • 哦,没有看到你已经提到了堆栈。无论如何,其他问题仍然存在。
  • 链表是一个有趣的想法,我会给出一些思考。分页是必须的,目前 UI 团队还没有实现。我认为这将是一个无穷无尽的滚动,因为我无法想象使用真实页面进行拖放..

标签: .net rest sorting drag-and-drop user-experience


【解决方案1】:

这是我的练习。

我正在使用相对变化值来进行序列变化。

在 HTTP 请求中:

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

{ "$change": n }

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

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

然后在服务器中,我在这些情况下更改此字段:

  • 如果n 是一个数字,则将所有n 项目的顺序按+/-1 更新,并更新:buttonId 项目+/-n。加号/减号取决于方向。
  • 如果n 是+/-'INFINITY',表示你想把它放在顶部或尾部。然后获取范围内的最大/最小序列,加/减 1 将是您要设置的值。

任何一种情况都不会超过 2 个 SQL 查询(不包括 SELECT)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2012-12-15
    • 2019-07-19
    • 2010-09-18
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多