方法为 post 时的 $http 服务缓存

$http service cache when the method is post

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

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

我有以下问题:

我不确定缓存是否正常工作。但是你可以使用 $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; header不考虑。

缓存的响应是return异步编辑的,其方式与来自服务器的响应相同。

如果使用尚未填充的相同缓存发出多个相同的请求,将向服务器发出一个请求,其余请求将return相同的响应。

响应中的 cache-control header 不影响是否缓存响应或如何缓存响应。

来自docs

Only GET and JSONP requests are cached.

如果你想缓存 POST-requests,你必须手动完成。您将需要制作一个 service/factory 来缓存响应并作为 $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 和缓存对象以及 returns 执行以下操作的函数请求并缓存它。

AngularJS documentation 提到:

Only GET and JSONP requests are cached.

$http.get(url, {cache: true}) 在默认缓存对象 (created with $cacheFactory).

中缓存 HTTP 响应

$cachefactory 上的项目存储为 键值对 。在 $http 对象上指定的 url 用作缓存的 value(将被返回)的 key。这是它与 GET 配合良好的原因之一,它仅取决于 URL 被击中。

POST 请求的情况下,除了 URL 被命中之外,发送的数据也会影响响应,这使得缓存 POST 请求变得更加复杂(因为request 也必须成为密钥的一部分)。来自 W3 specs:

The actual function performed by the POST method is determined by the server and is usually dependent on the Request-URI.

The action performed by the POST method might not result in a resource that can be identified by a URI.

Responses to this method are not cacheable, unless the response includes appropriate Cache-Control or Expires header fields.

如果您的数据很简单,this SO link 可能会有点用处。