2013-06-18 40 views
7

Non riesco a trovare una risposta a quella che sembra una domanda ragionevole.

Sto utilizzando il servizio $ http per chiamare i servizi Web per tutta la mia app. Tutte le API del server sono ospitate in un particolare indirizzo. C'è un modo in cui posso ottenere $ http per prefisso sempre l'URL fornito con il server API?

Per esempio, se il mio API è a http://myAPi/API/, mi piacerebbe essere in grado di chiamare:

$http.get("User")... 

in contrapposizione a:

$http.get("http://myAPI/API/User") 

e spigoloso prefissi la richiesta con l'indirizzo del server . L'obiettivo è di non avere l'URL diffuso in tutta l'app.

C'è un modo per ottenere questo con Angular?

+0

possibile duplicato di [utilizzando un percorso relativo per una chiamata di servizio in AngularJS] (http://stackoverflow.com/questions/17011616/using-a-relative-path-for-a-service-call-in-angularjs) – Stewie

+0

I possibili dettagli duplicati di ciò che ho attualmente - essenzialmente la posizione del server memorizzato in una variabile di qualche tipo e prefissato manualmente per ogni chiamata. Sto cercando un modo per il prefisso per essere automaticamente prefisso, se questo è possibile. – jwest

risposta

4

Da $ HTTP non hanno un modo integrato di gestione di questo caso (diverso da modificare il codice sorgente angular.js), è possibile avvolgere la $ http in un servizio:

apiService.get('user'); //where the service defines the $http call and builds the URL 

... o semplicemente creare una costante angolare:

angular.module('myApp', []).constant('apiPrefix', 'http://myAPI/API/') 

$http.get(apiPrefix + 'User') 

In entrambi i casi si tradurrebbe a "non avere la diffusione in tutto l'URL app".

-1

È possibile aggiungere un intercettore al provider http.

// register the interceptor as a service 
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { 
    return { 
    // optional method 
    'request': function(config) { 
     // do something on success 
     return config || $q.when(config); 
    } 
} 

Quindi si registra il proprio intercettore.

$httpProvider.interceptors.push('myHttpInterceptor'); 

Non vi resta che modificare il config :)

+4

Fai attenzione, anche i modelli sono intercettati. Non vuoi caricare '/ api/my_template.html' – Utopik

4

Si tratta di una vecchia questione, ma ho fatto una soluzione di qualche tempo fa

angular 
    .module('app') 
    .config(function ($httpProvider) { 
    $httpProvider.interceptors.push(apiInterceptor); 
    }); 

// api url prefix 
var API_URL = 'http://localhost:8080/'; 

function apiInterceptor ($q) { 
    return { 
    request: function (config) { 
     var url = config.url; 

     // ignore template requests 
     if (url.substr(url.length - 5) == '.html') { 
     return config || $q.when(config); 
     } 

     config.url = API_URL + config.url; 
     return config || $q.when(config); 
    } 
    } 
} 
Problemi correlati