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

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

Я пытаюсь изменить адрес АФИ вызовов и добавьте апите URL к началу Аякса вызовов в перехватчике InstEd каждой сервисной функции как

function getAssesmentResults(params) { 

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

Однако перехватчик перехватывает все HTTP-запросы, такие как .css или .html или .json. Что такое хороший способ изменить URL-адреса в перехватчике без изменения других HTTP-запросов?

+0

У всех ваших вызовов API есть что-то общее? –

ответ

3

$http has a facility to intercept and rewrite URLs что я с на $httpProvider. Когда я запускаю на производстве, у меня есть дополнительный токен: '/ 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') 
    } 
}]) 
+0

, пожалуйста, исправьте меня, если я ошибаюсь. поэтому я считаю, что вы предлагаете использовать что-то вроде этого. поэтому в основном я добавлю api url путь к вызовам api, но вызовы на статические ресурсы не будут изменены, если (response.config.url.startsWith ('/ api /')) { // Делайте свою собственную обработку здесь } –

+0

В точку. Вот такие строки, как 'var files_request_regex = new RegExp ('^/(files /(.*))$')' и 'config.url = config.url.replace (files_request_regex, rest_srvr + '/ $ 1')' do. –

1

Я бы создал сервис, который обертывает $http. Тогда в вашем коде вы всегда будете называть этот обертку вместо $http и сможете делать все, что хотите, с запросом до его отправки. Просто простой пример:

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

Используйте общий сервис для этого:

Generic услуги

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; 
     } 
    }; 
}); 
Смежные вопросы