在每个http请求中添加公共参数

时间:2016-01-31 14:29:31

标签: angularjs angularjs-resource

假设我的所有Rest API都需要接受以下参数:
1)param1
2)param2

以这种方式实现这将是一件非常繁琐的工作(请参阅下面的代码)。 此外,它无视DRY的概念。我正在寻找的是一个全局配置,允许默认参数与http请求一起传递。

我相信 $ httpProvider 是我能得到的最接近的(因为它可以全局定义cookie到期,标题等),但似乎我找不到使用它传递参数的方法。

angular.module('myApp.services').factory('Entry', function($resource) {
  return {
      method1: $resource('/api/entries/:id/:param1/:param2',
      { id: '@_id', param1:'@param1', param2: '@param2'}, {
        update: {
          method: 'PUT' // this method issues a PUT request
        }
      }),
      method2: $resource('/api/entries2/:param1/:param2',
      {param1:'@param1', param2: '@param2'}, {

      })
});

我希望从最终的优化代码中得到类似的东西。

angular.module('myApp.services').config($httpProvider){
    $httpProvider.defaults.param('param1');
    $httpProvider.defaults.param('param2');
}


angular.module('myApp.services').factory('Entry', function($resource) {
  return {
      method1: $resource('/api/entries/:id/',
      { id: '@_id' }, {
        update: {
          method: 'PUT' // this method issues a PUT request
        }
      }),
      method2: $resource('/api/entries2'),
      {}, {

      })
});

1 个答案:

答案 0 :(得分:1)

您必须创建一个拦截器服务,然后将拦截器添加到app.config()中的$ httpProvider。

创建拦截器服务:

angular.module('app').factory('myInterceptorService', myInterceptorService);

function myInterceptorService(){
   var param1,param2;
   return{
       request:  requestInterceptor,
       setParams:  setParams
  };
  function requestInterceptor(config){
       config.params.push(param1);
       config.params.push(param2);
       return config;
  }
  function setParams(p1,p2){
       param1=p1;
       param2=p2;
  }
}

要使用app config注册,请将$ httpProvider添加到app.config

app.config([...,'$httpProvider'...){
    $httpProvider.interceptor.push('myInterceptorService');
}