【问题标题】:Please help me with RESTful http caching请帮助我使用 RESTful http 缓存
【发布时间】:2015-07-02 08:38:05
【问题描述】:

我正在开发一个移动应用程序,它从我们的REST-Server 加载数据。例如,这个产品列表。产品存储在服务器上的数据库表中,具有以下结构:

| id | updatet_at          | name  | price |
|----|---------------------|-------|-------|
| 1  | 23.08.2015 06:00:00 | bread | 10    |
| 2  | 24.08.2015 12:00:00 | butter| 55    |
| 3  | 24.08.2015 12:00:00 | cheese| 180   |
| 4  | 24.08.2015 18:00:00 | sugar | 80    |

我的目标是了解标准缓存方案。现在我的缓存是这样工作的:

1)

GET /api/v1/products HTTP/1.1
Accept: application/json


HTTP/1.1 200 OK
Last-Modified: 24.08.2015 18:00:00
Content-Type: application/json

[
  { "id" : "1", "name" : "bread", "price" : 10 },
  { "id" : "2", "name" : "butter", "price" : 55 },
  { "id" : "3", "name" : "cheese", "price" : 180 },
  { "id" : "4", "name" : "sugar", "price" : 80 }
]

服务器给我答案后,我将数据缓存在本地数据库的同一张表中,唯一的区别是,我把updated_at每个元素==Last-Modified随服务器一起提供。所以我的本地数据库如下:

| id | updatet_at          | name  | price |
|----|---------------------|-------|-------|
| 1  | 24.08.2015 18:00:00 | bread | 10    |
| 2  | 24.08.2015 18:00:00 | butter| 55    |
| 3  | 24.08.2015 18:00:00 | cheese| 180   |
| 4  | 24.08.2015 18:00:00 | sugar | 80    |

然后我发送以下请求:

2)

GET /api/v1/products HTTP/1.1
Accept: application/json
If-Modified-Since: 24.08.2015 18:00:00


HTTP/1.1 304 Not Modified

[Empty body]

请求头If-Modified-由于我是从updated_at字段替换最新日期,因为服务器数据没有更新或添加,所以从服务器返回响应304.让服务器添加一个条目和一个现有的改变:

| id | updatet_at          | name  | price |
|----|---------------------|-------|-------|
| 1  | 23.08.2015 06:00:00 | bread | 10    |
| 2  | 24.08.2015 12:00:00 | butter| 55    |
| 3  | 24.08.2015 12:00:00 | cheese| 180   |
| 4  | 26.08.2015 09:00:00 | sugar | 90    |
| 5  | 26.08.2015 08:00:00 | flour | 60    |

我再次发送询问

3)

GET /api/v1/products HTTP/1.1
Accept: application/json
If-Modified-Since: 24.08.2015 18:00:00


HTTP/1.1 200 OK
Last-Modified: 26.08.2015 09:00:00
Content-Type: application/json

[
  { "id" : "4", "name" : "sugar", "price" : 90 },
  { "id" : "5", "name" : "flour", "price" : 60 }
]

收到此回复后,我根据答案更改id == 4 的记录,并添加一个新条目。我将这两条记录都放入了来自相应服务器的updated_at == Last-Modified 响应。我对缓存的实现非常满意,直到我在参数 GET request 上输入了选项。假设我清理了本地缓存并发送以下查询:

4)

GET /api/v1/products?min_price=60&max_price=100 HTTP/1.1
Accept: application/json


HTTP/1.1 200 OK
Last-Modified: 26.08.2015 09:00:00
Content-Type: application/json

[
  { "id" : "4", "name" : "sugar", "price" : 90 },
  { "id" : "5", "name" : "flour", "price" : 60 }
]

在这里,在 GET 参数字符串中,我传递了 min_price = 60 和 max_price = 100 。服务器根据我的要求,在现有元素中进行选择,并根据缓存方案给我2个合适的,他用Last-Modified中所选元素中的最大值updated_at替换。我的客户端应用程序缓存数据来。本地数据库如下:

| id | updatet_at          | name  | price |
|----|---------------------|-------|-------|
| 4  | 26.08.2015 09:00:00 | sugar | 90    |
| 5  | 26.08.2015 09:00:00 | flour | 60    |

现在,我将发送所有产品的请求:

5)

GET /api/v1/products HTTP/1.1
Accept: application/json
If-Modified-Since: 26.08.2015 09:00:00


HTTP/1.1 304 Not Modified

[Empty body]

事实证明,由于我已经提供了最大的updated_at,因此我的缓存方案失败了。提示如何对动态数据使用标准 HTTP 缓存?

【问题讨论】:

    标签: api rest http caching client-server


    【解决方案1】:

    如果您要请求单独的资源,您可以使用单独的 updated_at 值。但是如果您想使用If-Modified-Since 请求整个集合,则需要单独跟踪您上次请求整个集合的时间。否则,您将遇到您所看到的问题,因为单个记录可能会独立于整个集合进行更新。

    假设您使用的是ETags 而不是上次修改日期。您不会为个人记录发送ETag 并期望得到正确的收集结果,对吗?

    另一个合理的选择是请求不带 ETag 的集合,然后执行单独的 GET 以检索资源,为每个单独的资源发送 If-Modified-Since。这种方法对你来说可能会也可能不会太吵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2021-09-24
      • 2011-03-11
      • 2010-09-18
      相关资源
      最近更新 更多