如何缓存从$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
});
我看了下面的教程:从$http调用缓存服务器响应的https://coderwall.com/p/40axlq。但它解释了$http.get()样式,并将缓存数据,如果绝对URL相同,则不会发出第二个$http请求。
当我的‘$http’属性与将来相同的when方法调用相同时,我可以将缓存与我的数据调用风格一起使用吗?我正在为我的WebMethods使用ASP.net ASMX webservice。
发布于 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服务之前进行检查。如果不了解更多关于你的数据方法,我不能给你一个完整的例子,但你可以这样做:
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”理解为键。
发布于 2017-02-17 12:37:11
使用POST请求在数据存储中添加新记录,PUT和DELETE修改数据存储的状态。兑现他们中的任何一个都是没有意义的。
只获取检索数据而不修改数据存储。这对兑现它的回应是有意义的。
https://stackoverflow.com/questions/21501367
复制相似问题