AngularJS预处理特定的$ http请求

时间:2013-09-19 10:43:58

标签: angularjs

我通过$ 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行代码难以维护。

关于更干净整洁的解决方案的任何想法?谢谢。

1 个答案:

答案 0 :(得分:1)

我不会在这里链接适配器,因为正如你所说,它很难维护。

我的建议是使用$ http拦截器(不是responseInterceptors,不推荐使用,但是正常的拦截器,请参阅http://docs.angularjs.org/api/ng。$ http)。

请注意,您可以访问具有请求网址的“config”对象,以及其他有趣的属性。

它不会是超级的,但至少问题可以包含在代码库的一个孤立部分中。