2016-10-13 10 views
4

當我設置$ HTTP緩存請求,我還是看到重複請求(具有相同的URL和相同的數據)發送到從瀏覽器的網絡服務器,

$http.post(url, data, {cache:true}).success(function(response) { 

我有以下問題:

  • 這是正確的行爲嗎?
  • 我們可以緩存發佈的請求嗎?
  • 這是這樣做的正確方法,或者我應該用$ cachefactory手動執行它嗎?

回答

3

docs

只能得到和JSONP請求緩存。

如果您想要緩存POST請求,您必須手動執行它。您需要製作緩存響應的服務/工廠,並作爲$ http之前的圖層。您可以使用$cacheFactory或只是一個普通的對象。

function cacheService($http, $q){  
    var cache = {};  
    this.callSomething = function(postData){ 
    let deferred = $q.defer(); 
    let hash = angular.toJson(postData); 
    if(cache[hash]){ 
     deferred.resolve(cache[hash]); 
    } else { 
     $http.post('path/to/resource', postData).then(function(response){ 
     cache[hash] = response; 
     deferred.resolve(response); 
     }); 
    }   
    return deferred.promise; 
    } 
} 

這是一個簡單的例子,你當然可以使用相同的原理,並作出更廣義的服務,它的URL,POSTDATA和緩存對象,並返回該做的請求,並對其進行緩存的功能。

+1

很好解釋,謝謝丹尼爾 – sisimh

2

我不知道緩存工作。但是你可以使用$ cacheFactory。

app.factory('Cache', function ($cacheFactory) { 
    return $cacheFactory('Cache'); 
}); 

app.controller('MyController', function ($scope, $http, Cache) { 
    $http.post(url, data, {cache:Cache}).success(function(response) {} 
}); 

編輯:

只能得到和JSONP請求緩存。

緩存鍵是包含搜索參數的請求URL;標題不被考慮。

緩存的響應以與來自服務器的響應相同的方式異步返回。

如果多個相同的請求使用相同的緩存(尚未填充)進行,則會向服務器發出一個請求,其餘請求將返回相同的響應。

響應中的緩存控制標頭不會影響是否緩存或如何緩存響應。

+0

@PankajParkar是的。但是這對POST調用不起作用。剛剛在這發現了一個筆記。 – Ved

0

AngularJS documentation提到:

只能得到和JSONP請求緩存。

$http.get(url, {cache: true})將HTTP響應緩存在默認緩存對象(created with $cacheFactory)中。

$cachefactory上的項目存儲爲鍵值對。在$ http對象上指定的url用作密鑰,用於高速緩存的(將返回)。這是其與GET效果良好的原因之一,其僅取決於所擊中的URL。

如果發出POST請求,除了被命中的URL使得緩存請求更復雜(因爲請求也必須成爲密鑰的一部分)之外,所發送的數據也會影響響應。從W3 specs

通過POST方法執行的實際功能是由 服務器確定,並且通常取決於在Request-URI中。

POST方法執行的操作可能不會導致可以通過URI標識的資源 。

對此方法的響應不可緩存,除非響應 包含適當的Cache-Control或Expires標頭字段。

如果您的數據很簡單,this SO鏈接可能會有所幫助。