2013-06-14 10 views
5

stiamo attualmente sviluppando un piccolo progetto AngularJS e partendo dal frontend, quindi puro HTML e JavaScript.chiamando api esterne con AngularJS e ngResource

Tuttavia, è necessario effettuare alcune chiamate API utilizzando ngResource. Al momento stiamo usando canned per deridere il valore restituito JSON.

dicono che questo restituisce un JSON:

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

Voglio essere in grado di chiamare questo da ngResource:

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

Per qualche ragione questo non funziona, anche se il punto finale funziona correttamente. Angular richiede solo un'opzione a questo URL.

Questa è una sorta di protezione XSS e come posso risolverlo?

Aggiornamento: Aggiunta la IP-Address per esempio

EDIT:

Ho cambiato il server API finto, in modo che CORS è permesso.

ho tornare ora questa intestazione e la richiesta OPTIONS passa attraverso

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:* 

Ma ora, la richiesta GET viene cancellato (nessuna risposta viene restituita). Quindi suppongo che Angular faccia un qualche tipo di magia.

+1

puoi guardare JSONP se l'API esterna supporta JSONP – Atrix1987

+1

Il primo parametro a _ $ risorsa_ dovrebbe essere l'URL completo 'http: // indirizzo ip/qualcosa /: id.json' – remigio

+0

La tua app angolare e la risorsa "in scatola" vengono eseguite sullo stesso dominio: porta? In caso contrario, quindi [Jquery: Perché sto ricevendo una richiesta OPTION di una richiesta GET?] (Http://stackoverflow.com/questions/1256593/jquery-why-am-i-getting-an-options-request- invece-di-un-get-richiesta). – Stewie

risposta

7

Ok l'ho capito. È necessario iniettare il servizio $ http e impostare il 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}); 
}); 

Inoltre. Ogni richiesta al servizio deve restituire le intestazioni CORS corrette (non solo la richiesta OPZIONI)

+0

Non esiste qualcosa come useDomain in Angular. Non ha mai fatto il codice angolare. https://github.com/angular/angular.js/issues/2956 –

Problemi correlati