是否可以使用拦截器将GET / POST参数添加到Angular $ http请求中

时间:2014-06-25 16:35:03

标签: angularjs angular-http-interceptors

假设我需要在用户发出的每个请求中包含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;
          }
      };
  } ]);
 } ]);

1 个答案:

答案 0 :(得分:7)

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

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

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;
    });
  });