Restful api数据同步仅改变大型集合上的模型

时间:2014-06-24 13:50:12

标签: http rest caching collections metadata

我正在尝试找到一种最佳实践方法,使我的api以204响应。让我们考虑以下简化步骤:

  1. 客户端获取:服务器响应200完整收集10条记录
  2. 不做任何更改
  3. 客户端GET:服务器响应304数据未更改
  4. 对记录进行了更改5.添加了记录11。记录2已删除
  5. 客户端GET:服务器响应200,包含10个记录的新集合
  6. 对于10个记录,这不是一个大问题。但是,当一个集合让我们说几千条记录时,您不想刷新整个本地存储的集合。在这种情况下,更容易更改3个更新的模型(删除记录2,更新记录5,添加记录11)所以我想要这样的东西

    1. 客户端GET:服务器响应200完整集合(分页与否)
    2. 不做任何更改
    3. 客户端GET:服务器响应304数据未更改
    4. 对记录进行了更改5.添加了记录11。记录2已删除
    5. 客户端GET:服务器响应204,仅包含有关3个已更改记录的信息
    6. 在上述情况下,请求周期已经过优化,但问题是:如何让服务器像这样响应。我必须在标题或正文中从客户端发送一些信息。我正在考虑利用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"
          }
        ],
      }
      

      缺点是服务器会更复杂,因为它需要跟踪已删除的数据和上次更新的记录。

      请记住,我确实考虑过发送静默推送更新,但我不想这样做,因为用户并不总是对后台数据流量感到满意。

      你们对这个解决方案的看法是什么?你是否有类似或更好的解决方案,牢记以下几点?

      1. 降低所需的请求数量
      2. 使api具有描述性和细胞性(api是它自己的文档,允许客户端生成器)
      3. 尽可能地生活
      4. 有效地处理大量收藏(例如:分页,只提取 更新记录,缓存等)

2 个答案:

答案 0 :(得分:0)

您可以发送一个If-Modified-Since标头,其中包含您对该集合的GET请求。然后,端点只能返回自提供日期以来已更改的内容。

请注意,这不是the HTTP spec for conditional requests指定的行为。仔细考虑这是否是您想要采取的方法。我不建议。

在编写的规范中,我无法有条件地检索集合的子集。我能想到的最接近的是让集合只包含指向各个元素的链接。使用If-None-MatchIf-Modified-Since使客户端在每个元素上调用GET,这样您只能通过线路传递过时的实体。您仍然必须为集合实体命中服务器,但您也可以在该请求上使用条件标头。

答案 1 :(得分:0)

恕我直言,这需要一个查询接口,您可以在其中告诉 GET 参数中的其余服务您想要什么,类似于您在 SQL 或 solr 或 elasticsearch 查询中的执行方式。

为什么要在客户端显式查询的 HTTP 标头中隐藏某些内容,对吗?