2014-12-08 2 views
5

AngularJS 애플리케이션이 있고 REST 서비스 응답을 캐시하고 싶습니다. angular-cached-resource 같은 일부 라이브러리는 웹 브라우저의 로컬 저장소에 데이터를 저장하여이를 수행 할 수 있습니다.AngularJS를 사용한 REST 서비스 캐시 전략

가끔 POST/PUT/DELETE REST 호출을 수행 한 다음 일부 이전에 캐시 된 서비스 응답을 다시 수행해야합니다. 따라서 캐시 된 응답을 삭제하면 다음 번에 서버에 호출이 전송 될 수 있습니다.

하지만 서버가 HTTP Header에 나를 보내면 어떤 값이 expires 또는 etag과 같은 것입니까? HTTP 헤더를 읽고 스스로 반응해야하거나 AngularJS에이 라이브러리를 처리 할 수 ​​있습니까?

그래서 서버를 공격해야하고 로컬 저장소의 캐시를 읽지 않으면 HTTP 헤더 캐시 필드에 의존하고 예를 들어 "모든 페이지를 다시로드합니다."와 같은 응답이있는 PUT/POST/DELETE 호출이있는 경우 사용자 설정 요소 "가 필요합니다. 그래서이 응답을 받아서 다음에 실행될 때 또는 캐시가 HTTP에서 만료되는 경우 REST 서비스 A, C 및 F (사용자 설정 관련 항목)가 다시 서버에 충돌해야한다는 것을 알려주는 맵을 작성해야합니다. 헤더.

AngularJS 라이브러리에서 가능합니까? 아니면 다른 권장 사항이 있습니까? Observer 또는 PubSub Pattern과 비슷하다고 생각합니다. 그렇지 않습니까?

한 가지 더 : : 캐시/로컬 저장소를 사용하지 않고 PubSub과 같은 것을 사용할 수 있습니까 (HTTP 헤더 캐시 컨트롤도 없음)? 그래서 나는 REST 서비스를 호출 할 수 없다. 왜냐하면 어떤 경우에는 원하지 않는 서버에 충돌 할 것이기 때문이다. (이전 REST 호출의 응답으로 모든 사용자 설정 요소의 "reload"이벤트를 리턴한다.)

+0

펍/서브 패턴으로 할 수 있습니다. post/put/del 요청에서 응답이있는 이벤트를 발생시키고 서비스의 리스너가 요청을 기다린 다음 GET 요청을 받도록하십시오. – reptilicus

+0

예,하지만 다시로드해야하는 페이지 요소가 동일한 웹 페이지에 표시되지 않기 때문에 REST 호출을 즉시 수행 할 필요가 없습니다. – Tim

+0

우리가하는 일은 userOptionsService와 같은 서비스의 이벤트를 듣고 POST가 전송되면 userOptionsService에서 다시로드 한 다음 컨트롤러에서 userOptionsService.userOptions에 저장된 데이터를로드하는 것입니다. – reptilicus

답변

0

다음과 같이 시도해 볼 수 있습니다.

app.factory('requestService', ['$http', function ($http) { 

    var data = {}; 

    var service = { 
     getCall : funtion(requstUrl, successCallback, failureCallback, getFromCache){ 
        if(!getFromCache){ 
         $http.get(requstUrl) 
          .success(function(data){ 
           successCallback(data); 
           data.requstUrl = data; 
          }) 
          .error(function(){ 
           failureCallback(data); 
          }) 
        }else{ 
         successCallback(data.requstUrl); 
        } 
       }, 
     postCall : function(requestUrl, paramToPass, successCallback, failureCallback, getFromCache){ 
        if(!getFromCache){ 
         $http.post(requestUrl, paramToPass) 
          .success(function(data){ 
           successCallback(data); 
           data.requstUrl = data; 
          }) 
          .error(function(data){ 
           failureCallback(data); 
          }) 
        }else{ 
         successCallback(data.requstUrl); 
        } 
     } 
    }; 

    return service; 
}]); 

이것은 개념을 구현하기 위해 작성한 간단한 코드입니다. 나는 그것을 시험하지 않고 모두 당신입니다.

관련 문제