2013-06-18 16 views
7

Nie mogę znaleźć odpowiedzi na pytanie, które wydaje się uzasadnione.

Używam usługi $ http do wywoływania usług internetowych dla całej mojej aplikacji. Wszystkie interfejsy API serwera są hostowane pod konkretnym adresem. Czy jest jakiś sposób, aby uzyskać $ http, aby zawsze poprzedzać podany adres URL serwerem API?

Na przykład, jeśli API jest w http://myAPi/API/ chciałbym móc zadzwonić:

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

w przeciwieństwie do:

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

i kątowe prefiksów żądanie z adresu serwera . Celem jest, aby adres URL nie był rozpowszechniony w całej aplikacji.

Czy można to osiągnąć za pomocą Angular?

+0

możliwe duplikat [Korzystanie z toru w stosunku do zgłoszenia serwisowego w AngularJS] (http://stackoverflow.com/questions/17011616/using-a-relative-path-for-a-service-call-in-angularjs) – Stewie

+0

Możliwe duplikaty szczegółów, które aktualnie posiadam - w zasadzie lokalizacja serwera zapisane w jakiejś zmiennej i wstępnie wpisane ręcznie do każdego połączenia. Poszukuję sposobu, aby prefiks był automatycznie wstawiany, jeśli jest to możliwe. – jwest

Odpowiedz

4

Od $ http nie posiada wbudowany w sposób obsługi tej sprawy (inne niż edytowania kodu źródłowego angularjs), można owinąć $ w usłudze http:

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

... lub po prostu stwórz stałą kątową:

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

$http.get(apiPrefix + 'User') 

W obu przypadkach "nie ma adresu URL rozłożonego w aplikacji".

-1

Istnieje możliwość dodania przechwytywacza do dostawcy 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); 
    } 
} 

Następnie rejestrujesz przechwytywacz.

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

Po prostu trzeba edytować config :)

+4

Należy zachować ostrożność, szablony są również przechwytywane. Nie chcesz ładować '/ api/my_template.html' – Utopik

4

To stare pytanie, ale zrobiłem rozwiązanie jakiś czas temu

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