【发布时间】: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