我正在用php从头开始构建一个REST API,让它工作,现在,我想处理与头相关的缓存,这样客户端就不必一次又一次地请求他们已经拥有的资源。
rest服务中的每个实体都链接到一个数据库表,我使用的方法是在每个表上创建/更新字段,因此我可以在每个资源请求上提供"Last-modified"标头。
只是为了清楚地说明我如何处理请求,这是生成响应的代码片段,我计划在其中添加"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将由products和$resourceId将为1。
现在,对于缓存,如果$resourceId存在,我将简单地添加一个"last -modified"头,其中包含其最近更新的时间戳。
如果没有$resourceId,我将查询集合中最高更新的时间戳,并将其作为最后修改的标头。
最后一点就是我的问题所在。假设我的数据库中有20000种产品,并更新其中一种产品的价格;这意味着更新后对api/产品的请求将不得不再次获取20000项,虽然只有1字节的数据已被修改,我想知道是否有一种方法告诉浏览器,它应该只获取一条记录并更新其缓存。
这是我从零开始创建的第一个REST服务,因此,欢迎对我发布的这段代码提供任何建议。
谢谢。
我想知道是否有一种方法告诉浏览器它应该只获取一条记录并更新其缓存。
不,当您提供具有所有记录的单个资源时。
浏览器缓存很乐意为不同的产品管理不同的过期时间,但是没有将diff发送回浏览器的通用机制。
已经提出了解决方案(例如,Vary: ETag
),因为在轮询Atom提要时会出现本质上相同的问题,但它们需要了解这些技术的客户端。
要么减少主资源的大小,要么接受它将在每次更改时提供。
您可以实现服务器端缓存。这样更容易管理。您可以创建一个php数据库表,并将api响应存储在表中。您还可以使用memcache服务器来缓存api的响应