AngularJS预处理特定的$http请求
我正在通过$http.post向服务器发送一个模型,但是,比如说,必须删除空日期,必须将ID转换为int,在浮点值中,逗号必须替换为点。这些是服务器端json api的限制,所以我正在寻找一种修改$http请求的方法。复杂的部分是修改规则依赖于api方法名,而api方法名本身就是请求的一部分 最简单的方法是声明一个修改函数,并在$http.post之前将模型传递给该函数AngularJS预处理特定的$http请求,angularjs,Angularjs,我正在通过$http.post向服务器发送一个模型,但是,比如说,必须删除空日期,必须将ID转换为int,在浮点值中,逗号必须替换为点。这些是服务器端json api的限制,所以我正在寻找一种修改$http请求的方法。复杂的部分是修改规则依赖于api方法名,而api方法名本身就是请求的一部分 最简单的方法是声明一个修改函数,并在$http.post之前将模型传递给该函数 $scope.method1Adapter = function(model) { var data = angula
$scope.method1Adapter = function(model) {
var data = angular.copy(model);
// 30 lines of modification code
return data;
};
$http.post("/api", {method: "method1", "data": $scope.method1Adapter($scope.data)})
但我觉得这有点像意大利面条
更好的方法是使用工厂获取方法名并返回适配器回调
coreApp.factory("httpAdapter", function() {
return {
get: function (method) {
if (method == 'method1') {
return function (model) {
var data = angular.copy(model);
// modifications
return data;
}
} else {
return function (model) {
return model;
}
}
}
}
});
所以我可以将其添加到$httpProvider.defaults.transformRequest回调链中
coreApp.config(function($httpProvider, httpAdapterProvider) {
$httpProvider.defaults.transformRequest.unshift(function(post) {
if (post && post.data && post.data) {
post.data = httpAdapterProvider.$get().get(post.method)(post.method);
}
})
});
我仍然不喜欢这样,因为我的应用程序的api有16个方法,它需要5个适配器,大约100行代码很难维护
关于更干净整洁的解决方案有什么想法吗?谢谢。我不会在这里连接适配器,因为正如您所说,它很难维护 我的建议是使用$http拦截器(不是不推荐使用的ResponseInterceptor,而是普通的拦截器,请参阅。$http) 注意,除了其他有趣的属性外,您还可以访问包含请求url的“config”对象 它不会非常整洁,但至少问题可以包含在代码库的一个独立部分中