【发布时间】:2016-03-25 14:20:12
【问题描述】:
为了更好地使用启用了 hateoas 的 rest api,我想到了拦截 http 调用并在返回它们之前向我的资源对象添加一些方法。
这个想法是,如果资源有一个链接数组,我将添加方法来简化进一步的 http 请求。
下面的代码被推送到 $httpProvider 的拦截器数组中,几乎可以满足我的要求。
define(['angular'], function (angular) {
var $http = angular.injector(['ng']).get('$http');
function flattenLinks(links) {
for (var key in links) {
var rel = links[key].rel;
var href = links[key].href;
links[rel] = href;
}
}
return {
'response': function responseHandler(response) {
var data = response.data ? response.data : response;
if(typeof data === 'string' || !data.hasOwnProperty('links')) {
return response;
}
if(data.links instanceof Array) {
flattenLinks(data.links);
}
if(data instanceof Array) {
for(var key in data) {
responseHandler(data[key]);
}
}
data.hasLink = function(link) {
return link in data.links;
};
data.get = function(rel) {
return $http.get(data.links[rel]);
};
data.delete = function(rel) {
return $http.delete(data.links[rel]);
};
data.post = function(rel) {
return $http.post(data.links[rel], data);
};
data.put = function(rel) {
return $http.put(data.links[rel], data);
};
return response;
}
};
});
问题在于,如下所示,当我使用我添加的请求方法时,我的拦截器没有处理响应。从我的拦截器中完成的 $http.get、$http.delete 等不会被拦截(自然而然!)。
vm.someResourceObj.get('self').then(function(response) {
console.log(response);
});
所以问题是。如何处理对 $http 的内部调用?
【问题讨论】:
-
不太清楚问题是什么。拦截器将为所有请求运行
-
只要你用$http发出http请求,你的拦截器就会被调用,你能补充更多细节/解释会发生什么吗?
-
拦截器不适用于从拦截器内部完成的 $http 调用。在get、delete、post和put函数中执行的调用不会被拦截。
标签: angularjs restful-architecture