如何从restapi获取最新更新的资源?

ars1skjm  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(299)

在典型的rest api中,您可以获得以下所有书籍:

GET /books

但是,我希望能够轮询服务器(例如,每10秒)以获取任何更新的书籍,而不必重新获取我已经获取的所有书籍。我的第一个想法是使用更新的时间戳。
例如,如果在上一个请求中,最新的图书在 2020-06-01 10:30:25.125 ,我可以做如下请求,以获取在该时间戳之后更新的所有书籍。

GET /books?updated_at_gt=2020-06-01-10-30-25-125

这在大多数情况下都有效。不过,也有一些角落的情况。

问题

这种方法的问题是 updated_at 时间戳精确到最接近的毫秒。如果在同一毫秒内更新多个记录,则会出现问题。这听起来很少见,但可能发生在批量编辑上。
例如,考虑以下事件序列:
第1册更新为20.000000s。因此 updated_at 存储为: 2020-06-01 10:30:25.000 第二册于25:125000更新。因此 updated_at 存储为: 2020-06-01 10:30:25.125 25.125250秒 GET /books 会得到书1和书2,如预期的那样。
第三册更新于 25.125455s . 因此 updated_at 也存储为: 2020-06-01 10:30:25.125 (同第二册) GET /books?updated_at_gt=2020-06-01-10-30-25-125 我会想念第三本书的。

变通办法

我的工作是在第一次执行api调用时 2020-06-01 10:30:00.200 ,它将实际获取服务器请求时间之前50ms更新的所有书籍。
例如,考虑相同的场景:
第1册更新为20.000000s。因此 updated_at 存储为: 2020-06-01 10:30:25.000 第二册于25:125000更新。因此 updated_at 存储为: 2020-06-01 10:30:25.125 25.125250秒 GET /books 将在24.625250之前更新所有书籍‬. 所以它会得到第一本书,而不是第二本。
第三册更新于 25.125455s . 因此 updated_at 也存储为: 2020-06-01 10:30:25.125 (同第二册) GET /books?updated_at_gt=2020-06-01-10-30-25-000 我会拿到第二册和第三册。
这似乎是一项复杂的工作。
有更好的办法吗?

sczxawaw

sczxawaw1#

抱歉,由于声誉问题,我还不能添加评论。
老实说,我不完全明白为什么它会丢失,不管额外的毫秒细节,如果你不存储它们,如果你在更新时存储的内容完全相同,它怎么会丢失呢?
既然如此,为什么不设置一个中间的情况。存储更新的时间,但要记录您上次打电话的时间,并在旧时间和新时间之间进行比较
所以你要确保你的第一个查询总是在你关心之前就已经完成了
更新时间为\u gt>2020-01-01-00-00-00-000,更新时间为\u gt<=要存储的当前时间(最长为毫秒等)。
然后,您将存储<=的时间,以便下次,它将在时间更新。这样一来,它就永远不会归还它在<=时所做的书。
所以
查询一个更新的\u gt>2020-01-01-00-00-000和更新的\u gt<=2020-06-01 10:35:01.1245665
查询二
更新时间:2020-06-01 10:35:01.1245665和<=2020-06-01 10:35:11.1245665
举个例子。

h79rfbju

h79rfbju2#

可以使用epoch时间传入api。2020-06-11 5:31:53 am gmt的纪元时间是1591853513。epoch时间可以精确到毫秒,所以一旦服务器接收到epoch时间,它就可以直接减去毫秒,并根据它返回所需的书籍。参考-https://www.epochconverter.com for 历元转换器。使用epoch时间将是一个更干净的解决方案,而不是在查询参数中传递日期时间值。

GET /books?updated_at_gt=1591853513

另一个解决方案-如果可以对代码库和数据库进行修改,我建议您添加一个标记,该标记将针对get api调用中发送的所有书籍进行更新。这样你就不必检查任何时间,只需检查旗帜。

相关问题