其余服务中的每个实体都链接到一个数据库表,我使用的方法是每个表上创建/更新的字段,因此我可以在每个资源请求上提供“Last-modified”标头。< / p>
仅清楚如何处理请求,这是生成响应的代码段,以及我计划添加“Last modified”标题的位置
switch( strtolower($requestMethod) ){
...
case "get":{
if ($resourceId){
$this->resource = $resourceType::byId($resourceId);
if ( !$this->resource ){
$this->responseCode = 404;
}
else{
$this->responseBody = json_encode($this->resource);
$this->responseCode = 200;
$this->responseHeaders["Content-Type"] = "application/json; charset=UTF-8";
}
}
else{
$this->responseBody = json_encode($resourceType::find($this->requestData));
$this->responseCode = 200;
$this->responseHeaders["Content-Type"] = "application/json; charset=UTF-8";
}
}
break;
...
}
为了更清楚,使用以下请求/ api / products / 1 $ resourceType将按产品和$ resourceId为1。
现在,对于缓存,如果$ resourceId存在,我只需添加一个“Last-modified”标头及其上次更新的时间戳。
如果没有$ resourceId,我会查询集合中最高更新的时间戳,并将其作为最后修改的标题。
最后一点是我遇到问题的地方。假设我的数据库中有20000种产品,并更新单个产品的价格;这意味着更新后对api / products的请求必须再次获取20000个项目,尽管只修改了1个字节的数据,我想知道是否有办法告诉浏览器它应该获取只有一条记录并更新其缓存。
这是我从头开始的第一个REST服务,所以,对我发布的代码片段的任何建议都是受欢迎的。
谢谢。
答案 0 :(得分:1)
我想知道是否有办法告诉浏览器它应该只获取一条记录并更新其缓存。
不,不是在您提供包含所有记录的单一资源时。
浏览器缓存很乐意管理单独产品的单独到期时间,但是没有将差异发送回浏览器的通用机制。
已经提出了解决方案(例如,Vary: ETag
),因为在轮询Atom提要时基本上会出现相同的问题,但是它们需要知道这些技术的客户端。
要么减少主要资源的大小,要么接受它将在每次更改时提供。
答案 1 :(得分:0)
您可以实施服务器端缓存。它更容易管理。您可以创建一个php数据库表并将api响应存储在表中。您还可以使用memcache服务器缓存api的响应