AngularJS Interceptors - модифицирует данные ответа для кэшированных данных
Я хотел бы создать кеш-решение с etags, с угловыми перехватчиками. Все работает отлично, но я не могу вернуть кэшированные данные. Я хотел бы переписать 304 Not Modified
ответ с кэшированными данными.
'responseError': function(rejection) {
if(rejection.status === 304){
var response = {};
var url = rejection.config.url;
var params = rejection.config.params || {};
var etagKey = url+'.'+JSON.stringify(params);
var storedValue = $localStorage['ETag-Cache'+etagKey] || '{}';
var cachedObj = JSON.parse(storedValue);
console.log('CACHED ETag-Cache'+etagKey,cachedObj.response);
//I'd like to return with the cached data here but this doesn't work
return cachedObj.response;
}
return $q.reject(rejection);
}
Пример запроса ниже
$http.get('/api/bigdata', {
}).then(function(resp){
//I'd like to get the cached data in the resp variable
});
1 ответ
Я не нашел решения, но у меня есть обходной путь. Так как проблема с 304
статус ошибки, я отправляю обратно код состояния 200
вместо этого с пользовательским заголовком: Not-Modified = 1
и пустой ответ, тогда я обрабатываю это в перехватчике.
псевдокод в Laravel ETag MiddleWare
if ($requestEtag && $requestEtag[0] == $etag) {
$response->setStatusCode(200);
$response->header('Not-Modified', true);
$response->setContent('{"status":"Not-Modified"}');
}
Обработчик ответа AngularJS Interceptor:
//Etag Handler
var url = res.config.url;
var params = res.config.params || {};
var etag = res.headers().etag;
var etagKey = url+'.'+JSON.stringify(params);
var EtagVal = JSON.stringify(
{
'etag':etag,
'url':url,
'params':params,
'response':res.data
});
//If Not-Modified header is true
if(res.headers()['not-modified'] == "1"){
var storedValue = $localStorage['ETag-Cache'+etagKey] || '{}';
var cachedObj = JSON.parse(storedValue);
console.log('CACHED ETag-Cache'+etagKey,cachedObj.response);
res.data = cachedObj.response;
return res || $q.when(res);
}
Таким образом, я могу получить кэшированное значение в $http.then(response)
вместо загрузки всех данных с сервера.