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) вместо загрузки всех данных с сервера.

Другие вопросы по тегам