我正在开发一个移动应用程序,用于从我们的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缓存?