方法发布时$ http服务缓存

时间:2016-10-13 10:45:44

标签: angularjs angular-http

当我将$ http设置为缓存请求时,我仍然看到从浏览器网络发送到服务器的重复请求(具有相同的URL和相同的数据),

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

我有以下问题:

  • 这是正确的行为吗?
  • 我们可以缓存帖子请求吗?
  • 这是正确的方法,还是应该使用$ cachefactory?
  • 手动完成

3 个答案:

答案 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)

AngularJS documentation提到:

  

只缓存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链接可能会有点用处。