我正在尝试找到一种最佳实践方法,使我的api以204响应。让我们考虑以下简化步骤:
对于10个记录,这不是一个大问题。但是,当一个集合让我们说几千条记录时,您不想刷新整个本地存储的集合。在这种情况下,更容易更改3个更新的模型(删除记录2,更新记录5,添加记录11)所以我想要这样的东西
在上述情况下,请求周期已经过优化,但问题是:如何让服务器像这样响应。我必须在标题或正文中从客户端发送一些信息。我正在考虑利用Last-modified-since标头。这将是服务器上的日期更改。当状态为200或204时,客户端会存储此日期。当客户端将此标头发送到服务器时,服务器将仅响应此后更改或删除的记录。例如:
{
"total": 113440,
"from": 0,
"till": 2,
"count": 3,
"removed": [1,2],
"parameters": [{"id"}, {"title"}],
"collection": [
{
"id": 3,
"title": "Updated record"
},
{
"id": 4,
"title": "New record"
},
{
"id": 5,
"title": "Another new record"
}
],
}
缺点是服务器会更复杂,因为它需要跟踪已删除的数据和上次更新的记录。
请记住,我确实考虑过发送静默推送更新,但我不想这样做,因为用户并不总是对后台数据流量感到满意。
你们对这个解决方案的看法是什么?你是否有类似或更好的解决方案,牢记以下几点?
答案 0 :(得分:0)
您可以发送一个If-Modified-Since
标头,其中包含您对该集合的GET请求。然后,端点只能返回自提供日期以来已更改的内容。
请注意,这不是the HTTP spec for conditional requests指定的行为。仔细考虑这是否是您想要采取的方法。我不建议。
在编写的规范中,我无法有条件地检索集合的子集。我能想到的最接近的是让集合只包含指向各个元素的链接。使用If-None-Match或If-Modified-Since使客户端在每个元素上调用GET,这样您只能通过线路传递过时的实体。您仍然必须为集合实体命中服务器,但您也可以在该请求上使用条件标头。
答案 1 :(得分:0)
恕我直言,这需要一个查询接口,您可以在其中告诉 GET 参数中的其余服务您想要什么,类似于您在 SQL 或 solr 或 elasticsearch 查询中的执行方式。
为什么要在客户端显式查询的 HTTP 标头中隐藏某些内容,对吗?