incercept $ http请求修改api调用url

时间:2015-10-09 13:26:07

标签: angularjs api angular-http-interceptors

var app = angular.module('app');
// register the interceptor as a service
app.factory('myHttpInterceptor', function($q ) {
    return {

        'request': function(config) {
            return config;
        }
    };
});

我正在尝试修改api调用的url并将api url附加到每个服务函数的拦截器中的ajax调用的开头,如

    function getAssesmentResults(params) {

        return $http.get(url.api + '/results', {params: params})
            .then(function(response) {
                return response.data;
            });
    }

然而,拦截器拦截所有http请求,如.css或.html或.json文件。在不修改其他http请求的情况下修改拦截器中的URL的好方法是什么?

3 个答案:

答案 0 :(得分:3)

$httpProvider上配置的

$http has a facility to intercept and rewrite URLs。当我在制作中运行时,我有一个额外的令牌:' / rest /'与开发模式相比,我在拦截器中检测到生产模式(前缀packing)。这是我的app.js

var rest_srvr = 'http://dev-pc.example.com:8000'
app.factory('REST_Interceptor',[
        '$location',
function($location) {
  var request = function(config) {
    if (RegExp('packing','i').test(window.location.host)) {
      return config
    }
    var rest_request_regex = new RegExp('^.*?/rest/(.*)$')
    //console.log('config.url=%s',config.url)
    config.url = config.url.replace(rest_request_regex,rest_srvr+'/$1')

    var files_request_regex = new RegExp('^/(files/(.*))$')
    config.url = config.url.replace(files_request_regex,rest_srvr+'/$1')
    //console.log('  is now config.url=%s',config.url)
    return config
  }

  var translate_subpath = function(subpath) {
    return request({url:'https://'+$location.host()+subpath}).url 
  }

  return {
    request: request,
    translate_subpath: translate_subpath
  }
}])

app.config([
          '$httpProvider','$cookiesProvider',
  function($httpProvider,  $cookiesProvider) {
    if (!RegExp('packing','i').test(window.location.host)) {
      $httpProvider.interceptors.push('REST_Interceptor')
    }
}])

答案 1 :(得分:1)

我会创建一个包装$http的服务。然后在您的代码中,您将始终调用此包装而不是$http,并且可以在发送之前对请求执行任何操作。只是一个简单的例子:

module.factory('myHttp', function($http){
  return {
    get: function(url, params){
      var newUrl = "base-api-url/" + url;
      return $http.get(newUrl, params);
    }
  }
})

答案 2 :(得分:0)

使用通用服务:

通用服务

appCless.factory("$comum", function($http, $q, $injector) {
    function ajax(url, parametros, metodo) {
        var requisicao = $http({
            method: metodo,
            url: url,
            data:parametros
        });

        var promessa = requisicao.then(
            function(resposta) {
                return(resposta.data);
            },
            function(resposta) {
                return($q.reject("Something went wrong"));
            }
        );
        return promessa;
    }
    return({
        ajax:ajax
    });
});

<强>服务

app.factory("$categoriaproduto", function($comum) {
    var categoria;
    return {
        buscar : function(neoId) {
            var promessa = $comum.ajax("/fusion/services/roi/category/product/search", "", "POST");
            promessa.then(function(req) {  
                categoria = req.data;
            });
            return promessa;
        },
        cache : function() {
            return categoria;
        }
    };
});