首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AngularJS:如何缓存$http调用返回的json数据?

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

Stack Overflow用户
提问于 2014-02-02 01:45:10
回答 2查看 17.2K关注 0票数 17

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

代码语言:javascript
复制
$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
    });

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

当我的‘$http’属性与将来相同的when方法调用相同时,我可以将缓存与我的数据调用风格一起使用吗?我正在为我的WebMethods使用ASP.net ASMX webservice。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-02 03:11:48

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

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

当您这样想的时候,就会明白为什么缓存对POST请求的响应会更困难。POST请求返回的内容不仅取决于URL,还取决于POSTed内容。要将结果缓存到键值存储中,您需要一种机制来创建唯一的键,该键既可以标识URL,也可以标识传递的数据。

如果您的数据足够简单,我的建议是编写您自己的缓存,在使用angular $http服务之前进行检查。如果不了解更多关于你的数据方法,我不能给你一个完整的例子,但你可以这样做:

代码语言:javascript
复制
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”理解为键。

票数 31
EN

Stack Overflow用户

发布于 2017-02-17 12:37:11

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

只获取检索数据而不修改数据存储。这对兑现它的回应是有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21501367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档