9

假设我需要在用户发出的每个请求中包含一个 GroupId 参数,但我不想修改每个服务调用以包含该参数。是否可以使 GroupId 自动附加到所有请求,无论是 POST 还是 GET 查询字符串?

我一直在研究拦截器request功能,但不知道如何进行更改

** 编辑 **

下面的当前工作示例是 Morgan Delaney 和 haimlit 的建议的组合(我认为无论如何它是一个组合)。基本思想是,如果请求是 POST,则修改config.data. 对于 GET,修改params. 到目前为止似乎工作。

仍然不清楚提供程序系统如何在 Angular 中工作,所以我不确定在这里修改 data.params 属性是否完全合适。

.config(['$httpProvider', function ($httpProvider) {
  $httpProvider.interceptors.push(['$rootScope', '$q', 'httpBuffer', function ($rootScope, $q, httpBuffer) {
      return {

          request: function (config) {

              if (config.data === undefined) {
                  //Do nothing if data is not originally supplied from the calling method
              }
              else {
                  config.data.GroupId = 7;
              }

              if (config.method === 'GET') {
                  if (config.params === undefined) {
                      config.params = {};
                  }
                  config.params.GroupId = 7;
                  console.log(config.params);
              }

              return config;
          }
      };
  } ]);
 } ]);
4

1 回答 1

7

如果您的示例有效,那就太好了。但它似乎缺乏语义恕我直言。

在我的评论中,我提到了创建服务,但我使用工厂设置了一个示例 Plunker。

普朗克

相关代码:

angular.module( 'myApp', [] )
  .factory('myHttp', ['$http', function($http)
  {
    return function(method, url, args)
    {
      // This is where the magic happens: the default config
      var data = angular.extend({
        GroupId: 7
      }, args );

      // Return the $http promise as normal, as if we had just
      // called get or post
      return $http[ method ]( url, data );
    };
  }])
  .controller( 'myCtrl', function( $scope, $http, myHttp )
  {
    // We'll loop through config when we hear back from $http
    $scope.config = {};

    // Just for highlighting
    $scope.approved_keys = [ 'GroupId', 'newkey' ];

    // Call our custom factory
    myHttp( 'get', 'index.html', { newkey: 'arg' }).then(function( json )
    {
      $scope.config = json.config;
    });
  });
于 2014-06-25T21:55:17.690 回答