【发布时间】: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