方法为 post 时的 $http 服务缓存
$http service cache when the method is post
当我将 $http 设置为缓存请求时,我仍然看到重复的请求(具有相同的 url 和相同的数据)从浏览器网络发送到服务器,
$http.post(url, data, {cache:true} ).success(function(response) {
我有以下问题:
- 这是正确的行为吗?
- 我们可以缓存 post 请求吗?
- 这是这样做的正确方法还是我应该使用 $cachefactory 手动完成?
我不确定缓存是否正常工作。但是你可以使用 $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 执行以下操作的函数请求并缓存它。
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 可能会有点用处。
当我将 $http 设置为缓存请求时,我仍然看到重复的请求(具有相同的 url 和相同的数据)从浏览器网络发送到服务器,
$http.post(url, data, {cache:true} ).success(function(response) {
我有以下问题:
- 这是正确的行为吗?
- 我们可以缓存 post 请求吗?
- 这是这样做的正确方法还是我应该使用 $cachefactory 手动完成?
我不确定缓存是否正常工作。但是你可以使用 $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 执行以下操作的函数请求并缓存它。
Only GET and JSONP requests are cached.
$http.get(url, {cache: true})
在默认缓存对象 (created with $cacheFactory)
.
$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 可能会有点用处。