2015-07-02 49 views
2

我正在开发一个移动应用程序,用于从我们的REST-服务器加载数据。例如,这个产品清单。产品存储在一个数据库表中的服务器上,并具有以下结构:请帮助我使用RESTful http缓存

| 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请求的选择。比方说,我清理本地缓存,并发送以下查询:

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。根据我的请求,服务器在现有元素中进行选择,并给出了适合的相应缓存方案,他用最后修改中的所选元素中的最大值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)产品,因为我已经给出了最大的updated_at,所以我的缓存方案崩溃了。提示如何对动态数据使用标准HTTP缓存?

回答

0

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

假装您使用的是ETag而不是上次修改日期。你不会发送个人记录ETag,并期望找回正确的收集结果,你会吗?

另一个合理的选择是在没有ETag的情况下请求集合,然后执行单个GET来检索资源,并为每个单独资源发送If-Modified-Since。这种方法可能会或可能不会对你太嘈杂。