当我将$ http设置为缓存请求时,我仍然看到从浏览器网络发送到服务器的重复请求(具有相同的URL和相同的数据),
$http.post(url, data, {cache:true} ).success(function(response) {
我有以下问题:
答案 0 :(得分:7)
来自docs:
只缓存GET和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 :(得分: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) {}
});
编辑:
只缓存GET和JSONP请求。
缓存键是包含搜索参数的请求URL;标题不予考虑。
缓存响应以异步方式返回,与服务器响应的方式相同。
如果使用相同的缓存(尚未填充)发出多个相同的请求,则会向服务器发出一个请求,其余请求将返回相同的响应。
响应中的缓存控制标头不会影响缓存是否或如何缓存响应。
答案 2 :(得分:0)
只缓存GET和JSONP请求。
$http.get(url, {cache: true})
将HTTP响应缓存在默认缓存对象(created with $cacheFactory)
中。
$cachefactory
上的项目存储为键值对。 $ http对象上指定的网址用作缓存值(要返回)的键。这是与GET
配合良好的原因之一,POST
仅取决于被点击的网址。
如果发出POST
请求,发送的数据也会影响响应,除了被点击的URL,这使得缓存sudo apt-get -y install python-pip
pip install apscheduler
请求变得更加复杂(因为请求也必须变为关键的一部分)。来自W3 specs:
POST方法执行的实际功能由 服务器并且通常依赖于Request-URI。
POST方法执行的操作可能不会产生资源 可以通过URI识别。
除非响应,否则对此方法的响应不可缓存 包括适当的Cache-Control或Expires标头字段。
如果您的数据很简单,this SO链接可能会有点用处。