AngularJS:如何缓存从$ http调用返回的json数据?

时间:2014-02-01 17:45:10

标签: javascript asp.net json angularjs caching

如何缓存从$ http调用返回的json数据。我使用以下$ http调用样式:

$http({
        url: 'SomeWebMethodUrl',
        method: "POST",
        data: "{'query':'somevalue'}",
        headers: { 'Content-Type': 'application/json' }
    }).success(function (data, status, headers, config) {
        //something in success
    }).error(function (data, status, headers, config) {
        //something in error
    });

我查看了以下教程:https://coderwall.com/p/40axlq来自$ http调用的缓存服务器响应。但它解释了$ http.get()样式并将缓存数据,如果绝对URL相同,则不会发出第二个$ http请求。

将来我的'data'属性对于相同的webmethod调用是否相同时,我可以使用我的$ http调用样式进行缓存吗?我在WebMethods上使用ASP.net ASMX webservice。

2 个答案:

答案 0 :(得分:32)

angular.js缓存仅用于HTTP GET调用。这与HTTP协议的意图一致,因为HTTP服务器通常不会超出URL,HTTP方法和Cache-Control标头来确定它们是否可以响应具有缓存内容的请求。因此,angular的作者没有将缓存功能扩展到其他HTTP方法。

另一种看待它的方法是,角度$ cache服务实际上只是一个简单的键值存储,请求的URL充当键,而HTTP GET请求的响应则是本地存储的值在服务器上。

当您以这种方式想到它时,很明显为什么将响应缓存到POST请求会更加困难。 POST请求返回的内容不仅取决于URL,还取决于POSTed内容。要将结果缓存在键值存储中,您需要一种机制来创建唯一键,以标识URL和传递的数据。

如果您的数据足够简单,我建议您在使用angular $ http服务之前编写自己的缓存。在不了解您的数据方法的情况下,我无法给您一个完整的示例,但您可以执行以下操作:

angular.module('myModule').service('myDataService', function($cacheFactory, $http) {

  var cache = $cacheFactory('dataCache');

  function success(data, status, headers, config) {
    // some success thing
  }

  function error(data, stats, headers, config) {
    // some error thing
  }

  this.getSomeData = function(url, query) {
    var cacheId = url + '*' + query;
    var cachedData = cache.get(cacheId);
    // Return the data if we already have it
    if (cachedData) {
      success(cachedData);
      return;
    }

    // Got get it since it's not in the cache
    $http({url: url,
           method: 'POST',
           data: {query: query},
           headers: { 'Content-Type': 'application/json' }  // Probably not necessary, $http I think does this 
         }).success(function(data, status, headers, config) {
              // Put this in our cache using our 'unique' id for future use
              cache.put(cacheId, data);
              success(data, status, headers, configs);
         }).error(error);    

  };

});

然后,您将替换当前使用原始$ http服务的此包装器服务。

重点是在实际调用$ http服务之前实现自己的缓存,将“url + data”理解为一个键。

答案 1 :(得分:0)

用于在数据存储中添加新记录的POST请求的使用,PUT和DELETE修改数据存储的状态。兑现其中任何一个都没有意义。

只有GET在不修改数据存储的情况下检索数据。这是有意义的兑现它的回应。