gpt4 book ai didi

api - 请帮助我使用 RESTful http 缓存

转载 作者:可可西里 更新时间:2023-11-01 16:41:59 25 4
gpt4 key购买 nike

我正在开发一个从我们的 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-Since我是用字段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 。服务器根据我的要求,在已有的元素中进行选择,并根据缓存方案给我2个合适的,他将所选元素中的最大值updated_at代入Last-Modified。我的客户端应用程序缓存数据来了。本地数据库如下:

| 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缓存?

最佳答案

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

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

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

关于api - 请帮助我使用 RESTful http 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31179542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com