2016-04-27 21 views
15

Sto utilizzando l'API di recupero HTML5.Autorizza l'intestazione Access-Control-Allow-Origin utilizzando l'API di recupero HTML5

var request = new Request('https://davidwalsh.name/demo/arsenal.json'); 

     fetch(request).then(function(response) { 
     // Convert to JSON 
      return response.json(); 
     }).then(function(j) { 
      // Yay, `j` is a JavaScript object 
      console.log(JSON.stringify(j)); 
     }).catch(function(error) { 
      console.log('Request failed', error) 
     }); 

Sono in grado di utilizzare il json normale ma non riesco a recuperare i dati di sopra api url. getta errore:

Fetch API cannot load https://davidwalsh.name/demo/arsenal.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. 
+0

Il server di terze parti deve impostarlo, non c'è nulla che tu possa fare sul clientide. – epascarello

+0

@epascarello: Possiamo fare dal lato del cliente. Dietro la scena, XHR Request sta succedendo. Per favore controlla questo 'https: // davidwalsh.name/fetch' – iNikkz

risposta

14

Come epascarello Detto questo, il server che ospita la risorsa deve avere CORS abilitato. Cosa si può fare sul lato client (e probabilmente quello che si sta pensando di) è impostato la modalità di recupero per CORS (anche se questo è l'impostazione predefinita credo):

fetch(request, {mode: 'cors'}); 

Tuttavia questo ancora richiede la server per abilitare CORS e consentire al dominio di richiedere la risorsa.

Controllare il CORS documentation e questo awesome Udacity video che spiega Same Origin Policy.

È anche possibile utilizzare la modalità no-cors sul lato client, ma ciò fornirà una risposta opaca (non è possibile leggere il corpo, ma la risposta può ancora essere memorizzata nella cache da un operatore o consumata da alcuni API, come <img>):

fetch(request, {mode: 'no-cors'}) 
.then(function(response) { 
    console.log(response); 
}).catch(function(error) { 
    console.log('Request failed', error) 
}); 
+1

puoi approfondire" Tuttavia questo richiede ancora che il server abiliti CORS e permetta al tuo dominio di richiedere la risorsa. "? Ho cercato invano istruzioni per farlo. – jayscript

+0

@jayscript il processo generale ha il seguente aspetto: sul client, una richiesta di origine incrociata viene effettuata con javascript. Nel caso dell'API di recupero, la modalità 'cors' indica al browser che è possibile effettuare questa richiesta. Se invece avessi la modalità 'no-cors', il browser interromperebbe la richiesta, perché non è all'origine della tua app. Il server riceverà la richiesta e risponderà. Il * browser * conferma che la risposta ha le intestazioni CORS appropriate e, in tal caso, consente di leggere la risposta. Se le intestazioni non sono presenti, il browser genera un errore. –

+0

@jayscript [questo articolo MDN] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) entra nei dettagli. In sostanza, un server è necessario impostare queste intestazioni: "Access-Control-Allow-Origin: http: //foo.example", "Access-Control-Allow-Methods: POST, GET, OPTIONS", "Access-Control- Allow-Headers: X-PINGOTHER, Content-Type ", che abilita rispettivamente origini, metodi e intestazioni. Tipicamente '*' viene utilizzato per l'intestazione di origine. Puoi anche controllare questo documento Google e il codelab associato per conoscere l'API Fetch: https://developers.google.com/web/ilt/pwa/working-with-the- fetch-api –

Problemi correlati