我通过$ http.post向服务器发送模型,但是,必须删除空日期,必须将id转换为int,浮点值中的逗号必须用点替换。这些是服务器端json api的限制,所以我正在寻找一种修改$ http请求的方法。复杂的部分是修改规则依赖于api方法名称,它本身就是请求的一部分。
最直接的方法是在$ http.post之前声明一个修改函数并将模型传递给该函数
$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)})
但我认为这有点像spaghettysh。
更好的方法是获取方法名称并返回适配器回调的工厂。
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行代码难以维护。
关于更干净整洁的解决方案的任何想法?谢谢。
答案 0 :(得分:1)
我不会在这里链接适配器,因为正如你所说,它很难维护。
我的建议是使用$ http拦截器(不是responseInterceptors,不推荐使用,但是正常的拦截器,请参阅http://docs.angularjs.org/api/ng。$ http)。
请注意,您可以访问具有请求网址的“config”对象,以及其他有趣的属性。
它不会是超级的,但至少问题可以包含在代码库的一个孤立部分中。