0

我通过 $http.post 将模型发送到服务器,但是,必须删除空日期,必须将 id 转换为 int,在浮点值中,逗号必须替换为点。这些是服务器端json api的限制,所以我正在寻找一种修改$http请求的方法。复杂的部分是修改规则依赖于一个api方法名,它本身就是request的一部分。

最直接的方法是在 $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 行代码难以维护。

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

4

1 回答 1

1

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

我的建议是使用 $http 拦截器(不是已弃用的 responseInterceptors,而是普通拦截器,请参阅http://docs.angularjs.org/api/ng .$http)。

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

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

于 2013-09-19T14:39:38.597 回答