2013-07-29 14 views
11

Sto eseguendo un $ http.get per un JSON e sto ottenendo lo stato di 0. Ho scaricato lo stesso JSON e get funziona localmente, e in Python usando le richieste libreria Posso ottenere il JSON senza problemi, ma in AngularJS non funziona. Quello che non capisco è perché l'angolare non lo capisce ma tutto il resto lo è. Snippet di codice qui sotto.Stato HTTP 0 da AngularJS Get per JSON

function AgentListCtrl($scope, $http) { 
    $http.get('http://foo.bar/api/objects').success(function(data) { 
    $scope.objects = data; 
}).error(function(data, status) { 
    $scope.status1 = status; 
}); 

Ciò fornisce il JSON e lo analizza quando si utilizza un file locale, ma per il resto non riesce e set STATUS1 a 0.

risposta

2

Nel codice, l'assegnazione di stato si verifica solo quando l'errore accade. Si dovrebbe essere in grado di ottenere lo stato in cui la chiamata è stata effettuata con successo in questo modo:

success(function(data, status, headers, config) { 
    $scope.objects = data; 
    $scope.status1 = status; 
}).error(function(data, status) { 
    $scope.status1 = status; 
}); 
+0

Ma si sta ancora verificando un errore e non si ottiene effettivamente il contenuto quando lo si sta estraendo dal server quando ha ottenuto il json identico da locale proprio bene. Immagino che il codice di stato 0 non sia così importante come pensavo, è davvero l'incapacità di ottenere il json. –

+1

estraendolo dal server? Assicurati di non chiamare un'API ospitata su un altro dominio. Poiché javascript non consente la chiamata API cross-domain per impostazione predefinita. – zsong

+0

Sembra esattamente quello che sta succedendo. Grazie. Lavorerò con il file locale fino a quando non lo spingerò al server. –

20

Giusto per chiarire questo punto in quanto non è specificato direttamente nella risposta precedente (ma nei suoi commenti) e, come me, un po ' neofiti angolari possono essere trascorso qualche tempo su questo:

  • $ risorsa di angolare sarà in grado di eseguire un verbo REST su un altro server, che a sua volta rispondere correttamente (con un status 200). Angular tuttavia fallirà con un messaggio criptico, identificabile dallo stato 0. È ulteriormente fuorviante in quanto, nel debugger di un browser, si può effettivamente vedere la risposta del server.

  • angolare farà una richiesta OPTIONS su una richiesta di cross-domain (almeno per il metodo predefinito query()) a meno che specificato il contrario. Di solito il server non risponde con il contenuto desiderato (ad esempio la tua rappresentazione). Un modo semplice per fare ciò per richiesta è specificare il metodo da 'GET'.

    $resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'}); 
    
  • Il server di rispondere alle vostre richieste resto deve includere gli header specificati da CORS [1] al fine di consentire angolare di consumare correttamente la risposta. In sostanza, ciò significa includere l'intestazione Access-Control-Allow-Origin nella risposta, specificando i server da cui proviene la richiesta, che sono consentiti. Questo valore può essere *.

A complemento di questa risposta per tutti coloro che l'integrazione AngularJS con molla-dati-resto-webmvc:

  • il JSON formattato risposta hateoas non sarà correttamente consumato da angolare, producendo invece l'errore Expected response to contain an array but got an object . Questo problema viene risolto aggiungendo il parametro isArray: false alla configurazione di $resouce;

  • un esempio molto to-the-punto di configurazione CORS per lo scenario primavera-data-resto-webmvc è presentato in [2] (vedere la SimpleCORSFilter)

[1] https://developer.mozilla.org/en/docs/HTTP/Access_control_CORS

[2] https://spring.io/guides/gs/rest-service-cors/

+3

Nota che Angular non esegue la richiesta OPTIONS/preflight. Il browser fa. In effetti, Angular non ha conoscenza di questa richiesta, è completamente trasparente al codice lato client. –

+0

@ ray-nicholus Interessante. Puoi indicare qualsiasi riferimento su questo? – h7r

+0

Questo è un concetto base di CORS. Leggi di CORS in molti posti, come [CORS spec] (http://www.w3.org/TR/cors/) o [questo articolo MDN] (https://developer.mozilla.org/en- US/docs/HTTP/Access_control_CORS) –

1

Avevo un problema simile anch'io. Un'API di terze parti che restituisce JSON correttamente attraverso ogni altro mezzo non funzionava con lo stato 0 quando veniva chiamato tramite il metodo $ http.get() di Angular.

Nel mio caso non c'era alcun problema CORS. Invece, l'URL che stavo usando per l'API non era del tutto corretto e il server stava emettendo una risposta 301. Angolare non stava rispettando il reindirizzamento.

Parola al saggio.