當我設置$ HTTP緩存請求,我還是看到重複請求(具有相同的URL和相同的數據)發送到從瀏覽器的網絡服務器,
$http.post(url, data, {cache:true}).success(function(response) {
我有以下問題:
- 這是正確的行爲嗎?
- 我們可以緩存發佈的請求嗎?
- 這是這樣做的正確方法,或者我應該用$ cachefactory手動執行它嗎?
當我設置$ HTTP緩存請求,我還是看到重複請求(具有相同的URL和相同的數據)發送到從瀏覽器的網絡服務器,
$http.post(url, data, {cache:true}).success(function(response) {
我有以下問題:
從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和緩存對象,並返回該做的請求,並對其進行緩存的功能。
我不知道緩存工作。但是你可以使用$ 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;標題不被考慮。
緩存的響應以與來自服務器的響應相同的方式異步返回。
如果多個相同的請求使用相同的緩存(尚未填充)進行,則會向服務器發出一個請求,其餘請求將返回相同的響應。
響應中的緩存控制標頭不會影響是否緩存或如何緩存響應。
@PankajParkar是的。但是這對POST調用不起作用。剛剛在這發現了一個筆記。 – Ved
只能得到和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鏈接可能會有所幫助。
很好解釋,謝謝丹尼爾 – sisimh