AngularJS预处理特定的$http请求

AngularJS预处理特定的$http请求,angularjs,Angularjs,我正在通过$http.post向服务器发送一个模型,但是,比如说,必须删除空日期,必须将ID转换为int,在浮点值中,逗号必须替换为点。这些是服务器端json api的限制,所以我正在寻找一种修改$http请求的方法。复杂的部分是修改规则依赖于api方法名,而api方法名本身就是请求的一部分 最简单的方法是声明一个修改函数,并在$http.post之前将模型传递给该函数 $scope.method1Adapter = function(model) { var data = angula

我正在通过$http.post向服务器发送一个模型,但是,比如说,必须删除空日期,必须将ID转换为int,在浮点值中,逗号必须替换为点。这些是服务器端json api的限制,所以我正在寻找一种修改$http请求的方法。复杂的部分是修改规则依赖于api方法名,而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)})
但我觉得这有点像意大利面条

更好的方法是使用工厂获取方法名并返回适配器回调

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”对象

它不会非常整洁,但至少问题可以包含在代码库的一个独立部分中