2

如果我使用以下内容:

一个)

angularApp.config(function ($httpProvider) {
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
  $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
  $httpProvider.defaults.headers.common['Accept'] = 'application/json';
  $httpProvider.defaults.transformRequest = function(data) {
      if (data === undefined) {
          return data;
      }
      return $.param(data);
  }
});

相对

b)

angularApp.config(function ($httpProvider) {
  $httpProvider.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded';
  $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
  $httpProvider.defaults.headers.common['Accept'] = 'application/json';
  $httpProvider.defaults.transformRequest = function(data) {
      if (data === undefined) {
          return data;
      }
      return $.param(data);
  }
});

然后当我使用 a$http.post或 a$resourcePOST

a) 是我想要的,因为我在 Chrome 开发工具中得到了这个:

  Form Data:
    User[old_password]:xxx
    User[new_password]:yyyy
    User[new_password_confirm]:yyyy

b) 不是我想要的,因为我在 Chrome 开发工具中得到了这个:

Request Payload:
User%5Bold_password%5D=xxx&User%5Bnew_password%5D=yyyy&User%5Bnew_password_confirm%5D=yyyy

这让我很困惑,因为我希望 common 可以申请包括 post 在内的所有内容。

a) 和 b) 之间的唯一区别是 b) 具有

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

我正在使用 angular 1.2.6

问题也发生在1.2.9

请指教。

4

1 回答 1

2

在您的配置块中输入:

console.log($httpProvider.defaults.headers.post); 

// Object {Content-Type: "application/json;charset=utf-8"} 

如您所见,$http已经有一个 post 方法的默认标头。

当您声明公共标头时,$http不会使用公共标头覆盖方法特定标头。反之亦然,首先应用公共标头,然后方法特定标头覆盖它们(如果存在)。

您可以像这样重置默认值:

$httpProvider.defaults.headers.post = {};

http.js 中,您可以看到标头是如何合并的:

function mergeHeaders(config) {
  var defHeaders = defaults.headers,
      reqHeaders = extend({}, config.headers),
      defHeaderName, lowercaseDefHeaderName, reqHeaderName;

  defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);

使用Angular.extend时,后面对象的属性会覆盖任何前面对象的属性。

于 2014-01-19T10:34:26.750 回答