2017-06-14 1 views
1

Ich versuche, eine Abrufanforderung mit Fetch zu erstellen. Der Antrag sieht wie folgt aus:Erstellen einer Abrufanforderung mit Fetch - only-Optionen ist senden

fetch('https://requestb.in/14ikb6j1', { 
    method: 'get', 
    headers: { 
    'Authorization': 'Token token=xxxxx' 
    }}); 

Wenn ich diese Anfrage an meine eigenen Server zu machen, ist es nicht auf die Optionen jedes Mal anfordern. Ich kann nicht herausfinden warum.

Wenn ich diese Anfrage an requestbin mache, gibt es zuerst eine Option Anfrage. Nach Erhalt der Antwortoptionen wird die eigentliche Abrufanforderung jedoch nie ausgeführt.

Dies ist, was erhalten requestbin:

OPTIONS /14ikb6j1 

HEADERS 

Referer: http://localhost:9000/ 
Host: requestb.in 
Total-Route-Time: 0 
Via: 1.1 vegur 
Accept-Encoding: gzip 
Cf-Visitor: {"scheme":"https"} 
Cf-Ipcountry: NL 
Cf-Ray: 36edd35d1cad2b28-AMS 
Cf-Connecting-Ip: 37.153.231.90 
Connection: close 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 
Accept: */* 
Connect-Time: 1 
Access-Control-Request-Method: GET 
Content-Length: 0 
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4 
X-Request-Id: 69b120c1-0f18-454b-a7fd-91f082252a06 
Access-Control-Request-Headers: authorization 
Origin: http://localhost:9000 

Dies ist, was Chrom-Protokolle:

chrome dev tools


Das Merkwürdigste ist, erhalte ich eine 200 - OK Status als Ergebnis. Die Konsole jedoch meldet sich noch diese:

Fetch API cannot load https://requestb.in/14ikb6j1 . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:9000 ' 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. :9000/#/branching:1 Uncaught (in promise) TypeError: Failed to fetch

Aber wenn ich diesen Antrag stellen mit Postman es funktioniert: postman request

GET /14ikb6j1 
HEADERS 

Cf-Ipcountry: NL 
Cf-Ray: 36eddb797ebf7223-AMS 
Authorization: Token token=xxxx 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 
Total-Route-Time: 0 
Via: 1.1 vegur 
Connection: close 
Cf-Connecting-Ip: 37.153.231.90 
Connect-Time: 0 
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4 
Postman-Token: 57486701-6f9a-4aab-be1b-776f0d376920 
Accept: */* 
Host: requestb.in 
X-Request-Id: 73a7a35e-0d89-41fd-b760-2aa952349871 
Accept-Encoding: gzip 
Cf-Visitor: {"scheme":"https"} 
Cache-Control: no-cache 

Wie kann ich diese Anforderung mit Authentifizierung bekommen machen Header arbeiten?

+0

''Content-Type': 'application/json'' für eine GET-Anfrage. Ist das richtig? – Forivin

+0

@Forivin Sorry, du hast Recht. Durch das Entfernen dieser Inhaltstyp-Header ändert sich nichts. – Randy

Antwort

2

Dies ist wahrscheinlich ein CORS-Problem. Der Server, an den Sie die Anforderung richten, lässt keine Anforderungen von einer anderen Domäne zu. Überprüfen Sie Ihre Browser-Konsole und suchen Sie nach Fehlern. Sie könnten so etwas finden:

Fetch API cannot load https://requestb.in/14ikb6j1 . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' https://localhost:9000 ' 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

Aber warum sollte mein Postbotenantrag funktionieren, wenn der Kors deaktiviert ist? – Randy

+1

Weil Postbote keine Domain hat. Es verhält sich so, als wäre es ein normaler Benutzer, der eine Website öffnet. Als Browsererweiterung bekommt der Postbote diese Art von Privilegien, die diese Websites nicht selbst erhalten können. Es ist eine einfache Sicherheitsfunktion, die in Browsern integriert ist, um zu verhindern, dass Website A mit der Website B kommuniziert, es sei denn, Website B ist in Ordnung. – Forivin

Verwandte Themen