2016-04-27 4 views
15

Ich verwende HTML5-Fetch-API.Erlaube Access-Control-Allow-Origin-Header mit HTML5-Fetch-API

Ich bin in der Lage, normal json zu verwenden, aber nicht die Daten der oben genannten API abrufen. Es wirft Fehler:

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

Der 3rd Party Server muss eingestellt werden, es gibt nichts, was Sie auf der Clientseite tun können. – epascarello

+0

@epascarello: Wir können auf der Kundenseite tun. Hinter der Szene geht XHR Request weiter. Bitte überprüfen Sie diese "https: // davidwalsh.name/fetch" – iNikkz

Antwort

14

Wie epascarello sagte, der Server, der die Ressource hostet muss CORS aktiviert sein. Was können Sie auf der Client-Seite tun (und wahrscheinlich das, was Sie denken an) eingestellt wird, um die Art der zu CORS holen (obwohl dies die Einstellung Ich glaube Standardeinstellung):

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

Doch diese noch erfordert die Server, um auch CORS zu aktivieren und Ihrer Domäne zu erlauben, die Ressource anzufordern.

Überprüfen Sie die CORS documentation, und diese awesome Udacity video erklären die Same Origin Policy.

Sie können auf der Client-Seite auch den No-Cors-Modus verwenden, aber dies gibt Ihnen nur eine undurchsichtige Antwort (Sie können den Text nicht lesen, aber die Antwort kann immer noch von einem Service-Mitarbeiter zwischengespeichert oder von einigen konsumiert werden APIs, wie <img>):

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

können Sie näher auf "Allerdings erfordert dies noch den Server, um auch CORS zu aktivieren, und erlauben Sie Ihrer Domain, die Ressource anzufordern."? Ich habe erfolglos nach Anweisungen gesucht, um das zu tun. – jayscript

+0

@jayscript Der Gesamtprozess sieht folgendermaßen aus: Auf dem Client wird eine Kreuzursprungsanforderung mit Javascript erstellt. Im Fall der Fetch-API teilt der 'cors'-Modus dem Browser mit, dass es in Ordnung ist, diese Anfrage zu stellen. Wenn Sie stattdessen den Modus "Nein" verwenden würden, würde der Browser die Anfrage stoppen, da dies nicht auf die Herkunft Ihrer App zurückzuführen ist. Der Server wird die Anfrage erhalten und antworten. Der * Browser * bestätigt, dass die Antwort die entsprechenden CORS-Header hat, und wenn dies der Fall ist, kann die Antwort gelesen werden. Wenn die Header nicht vorhanden sind, löst der Browser einen Fehler aus. –

+0

@jayscript [dieser MDN Artikel] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) geht ins Detail. Im Wesentlichen müssen Sie einen Ihrer Server diese Header setzen: "Access-Control-Allow-Origin: http: // foo.example", "Zugriffssteuerungs-Erlauben-Methoden: POST, GET, OPTIONS", "Access-Control- Allow-Header: X-PINGOTHER, Content-Type ", die jeweils Ursprünge, Methoden und Header aktivieren. In der Regel wird für den Ursprungsheader "*" verwendet. Sie können dieses Google-Dokument und das zugehörige Codelab auch aufrufen, um mehr über die Fetch-API zu erfahren: https://developers.google.com/web/ilt/pwa/working-with-the- fetch-api –