我使用tonic.php(http://peej.github.com/tonic/)庫創建我的REST資源。數據非常穩定,並且緩存時間長可能更可取。我設置了緩存頭(使用tonic.php庫):如何緩存REST資源的不同格式/表示形式?
$lastModified = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME']) . ' GMT';
$expires = gmdate('D, d M Y H:i:s', ($_SERVER['REQUEST_TIME'] + $httpCacheDuration)) . ' GMT';
$response->addHeader('Cache-Control', 'public,max-age='.$httpCacheDuration.',must-revalidate');
$response->addHeader('Expires', $expires);
$response->addHeader('Last-Modified', $lastModified);
的問題是,當請求HTML捲曲呼叫到一個PHP網頁製作和返回的HTML被放入響應正文:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . '?identifier=' . $identifier);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
$response->body = $html;
這個返回的頁面然後通過對同一個資源的AJAX調用獲取實際數據,但是接受標頭爲「application/json」而不是「text/html」。 的AJAX調用使用jQuery做,如果我設置
cache: true
jQuery的$
與阿賈克斯接受我的資源的調用:text/html的將只顯示數據作爲JSON,而不是網頁(火狐)或拋出一個錯誤(IE8)。 代碼:
switch ($format) {
case 'html':
$response->addHeader('Content-type', 'text/html');
$lastModified = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME']) . ' GMT';
$expires = gmdate('D, d M Y H:i:s', ($_SERVER['REQUEST_TIME'] + $httpCacheDuration)) . ' GMT';
$response->addHeader('Cache-Control', 'public,max-age='.$httpCacheDuration.',must-revalidate');
$response->addHeader('Expires', $expires);
$response->addHeader('Last-Modified', $lastModified);
$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIE, $strCookie);
curl_setopt($ch, CURLOPT_URL, url . '?identifier=' . $identifier);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
$response->body = $html;
return $response;
break;
case 'json':
$result = DataManager::get($identifier);
if (empty($result)) {
$response->code = Response::NOTFOUND;
return $response;
}
$lastModified = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME']) . ' GMT';
$expires = gmdate('D, d M Y H:i:s', ($_SERVER['REQUEST_TIME'] + $httpCacheDuration)) . ' GMT';
$response->addHeader('Cache-Control', 'public,max-age='.$httpCacheDuration.',must-revalidate');
$response->addHeader('Expires', $expires);
$response->addHeader('Last-Modified', $lastModified);
$response->addHeader('Content-type', 'application/json');
$response->code = Response::OK;
$response->body = json_encode($result);
return $response;
break;
// we don't have a suitable format, so do a 406 response instead
default:
$response->code = Response::NOTACCEPTABLE;
$response->addHeader('Content-type', 'text/plain');
$response->body = getErrorPage(Response::NOTACCEPTABLE);
return $response;
break;
}
添加
$response->addHeader('Vary', 'Accept');
使得它的工作。然而,json永遠不會被緩存,這會導致與設置緩存相同的行爲:在Jquery ajax調用中爲false。
如何緩存2個不同的表示並讓瀏覽器爲請求的accept-header顯示正確的表示?
如果您更改網址,那麼該怎麼辦?如果我瞭解您的問題,則瀏覽器緩存不會根據請求中的Accept標頭區分內容。如果將'.json'附加到JSON數據包的URL,則瀏覽器將能夠根據URL進行緩存。 – Cheeso 2012-07-17 05:40:03
謝謝。這樣做的工作也讓你想知道什麼點不同:接受是如果它不工作,並且必須使用「hacky解決方法」。 – 2012-07-27 06:32:56
猜測......也許'Vary'是堆棧中不太成熟的部分之一。 – Cheeso 2012-07-27 16:50:24