2013-06-14 9 views
5

opracowujemy obecnie mały projekt AngularJS i zaczynając od frontendu, więc czysty HTML i JavaScript.wywoływanie zewnętrznego api z AngularJS i ngResource

Jednakże, musimy wykonać pewne wywołania API za pomocą ngResource. W tej chwili używamy canned, aby sfałszować wartość zwracaną przez json.

Powiedzmy to zwraca JSON:

GET http://ip-address/something/1.json 

Chcę, aby móc nazwać od ngResource:

app.controller('SomethingCtrl', function ($scope, $resource) { 
    Something = $resource("http://ip-address/something/:id", {id: "@id"}); 
    $scope.something = Something.get({id:1}); 
}); 

Z jakiegoś powodu to nie działa, chociaż końcowy pracuje prawidłowo. Angular właśnie wysyła żądanie opcji do tego adresu URL.

Czy to magia ochrony XSS i jak mogę ją rozwiązać?

Aktualizacja: Dodano IP-Adres, na przykład

EDIT:

Zmieniłem mock serwera API, tak że CORS jest dozwolone.

Wracam teraz ten nagłówek i wniosek OPCJE przechodzi

Access-Control-Allow-Headers:X-Requested-With 
Access-Control-Allow-Max-Age:86400 
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, HEAD, OPTIONS 
Access-Control-Allow-Origin:* 

Ale teraz, wniosek zostanie anulowany get (brak odpowiedzi zostanie zwrócone). Więc przypuszczam, że Angular robi jakąś magię.

+1

możesz zobaczyć JSONP, jeśli zewnętrzny interfejs API obsługuje JSONP – Atrix1987

+1

Pierwszym parametrem _ $ resource_ powinien być pełny URL 'http: // ip-address/something /: id.json' – remigio

+0

Czy Twoja aplikacja Angular App i "puszkowany" działają na tej samej domenie: port? Jeśli nie, to [Jquery: Dlaczego otrzymuję żądanie OPTIONS od żądania GET?] (Http://stackoverflow.com/questions/1256593/jquery-why-am-i-getting-an-options-request- insted-of-a-get-request). – Stewie

Odpowiedz

7

OK Rozgryzłem to. Trzeba wstrzyknąć usługę $ http i ustawić flagę useXDomain.

app.controller('SomethingCtrl', function ($scope, $http, $resource) { 
    $http.defaults.useXDomain = true; 
    Something = $resource("http://ip-address/something/:id", {id: "@id"}); 
    $scope.something = Something.get({id:1}); 
}); 

Ponadto. Każde żądanie usługi musi zwracać poprawne nagłówki CORS (nie tylko żądanie OPCJE)

+0

Nie ma czegoś takiego jak "useXDomain" w Angular. Nigdy nie przekształciła się w kod Angular. https://github.com/angular/angular.js/issues/2956 –

Powiązane problemy