7

有关transFormRequest 函数/数组的很好解释,请参见此处接受的答案。

在答案的最后一个例子中:

var transform = function(data){
    return $.param(data);
}

$http.post("/foo/bar", requestData, {
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
    transformRequest: transform
}).success(function(responseData) {
    //do stuff with response
});

但是,这样做的问题是transformRequest: transform覆盖了 Angular 预先构建的函数数组。

来自 Angular文档

要全局扩充或覆盖默认转换,请修改 $httpProvider.defaults.transformRequest 和 $httpProvider.defaults.transformResponse 属性。默认情况下,这些属性是一组转换函数,允许您将新的转换函数推送或取消转换到转换链中。您还可以决定完全覆盖任何默认转换,方法是直接将转换函数分配给这些属性,而不使用数组包装器。这些默认值在运行时再次在 $http 工厂中可用,如果您希望在转换中涉及运行时服务,这可能会很有用。

类似地,要在本地覆盖请求/响应转换,请增加传递到 $http 的配置对象的 transformRequest 和/或 transformResponse 属性。

如果我想在全球范围内应用我的变换功能,我会这样做

$httpProvider.defaults.transformRequest.unshift(myFunction)

或者

$httpProvider.defaults.transformRequest.push(myFunction)

我的问题
不是擦除整个转换请求函数数组,而是如何将另一个转换函数推送到调用,而不是全局?

4

3 回答 3

17

.concat我使用该方法找到了一个简单的解决方案

{
   transformRequest: [function(req){...}].concat($http.defaults.transformRequest)
}

或者,如果您希望在 Angular 的默认转换之后进行自定义转换。

{
   transformRequest: $http.defaults.transformRequest.concat([function(req){...}])
}
于 2014-02-25T16:14:15.623 回答
3

Angular,在文档中提出了这个建议:

$httpProvider.defaults.transformRequest = appendTransform($httpProvider.defaults.transformRequest, function(data) {
    //do whatever you want
    return data;
});

function appendTransform(defaults, transform) {

    // We can't guarantee that the default transformation is an array
    defaults = angular.isArray(defaults) ? defaults : [defaults];

    // Append the new transformation to the defaults
    return defaults.concat(transform);
}
于 2015-08-20T10:51:51.563 回答
1

这是另一个解决方案:

.config(function($httpProvider) {

      $httpProvider.defaults.transformRequest = function(data) {

        var query = '', name, value;
        if (data instanceof Object) {

            for(key in data) {

                name = key;
                value = data[key];

                query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';                   

            }
            return query;
        } else {
            return data;
        }

      };

      $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

})

希望有帮助

于 2014-12-13T13:36:31.007 回答