2016-06-14 8 views
7

Ich mache eine POST-Anfrage und die Anfrage sitzt nur, ausstehend, bis es schließlich fehlschlägt. Ich habe die Nginx-Protokolle und die Node-Server-Protokolle überwacht, und die Anforderung wird nicht einmal registriert. Das funktioniert für jeden anderen, den ich bis auf einen Kollegen getestet habe. Wenn ich den Edge-Browser oder einen anderen Computer verwende, funktioniert es einwandfrei.OPTIONEN (fehlgeschlagen) nur auf Chrome und Firefox

Ich habe versucht, POST-Anfragen an andere (benutzerdefinierte) Server zu machen, und es hängt auch an Optionen dort. Ich habe auch die POST-Anfrage mit jQuery gemacht und es schlägt auf die gleiche Weise fehl.

Es ist vielleicht erwähnenswert, dass ich das withCredentials Flag verwende.

Headers:

Provisional headers are shown 
Access-Control-Request-Headers:content-type 
Access-Control-Request-Method:GET 
Origin:http://localhost:8080 
Referer:http://localhost:8080/<path> 
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36 

Die Anfrage:

public login(user) { 
    const endpoint = `http://<url>`; 

    let headers = new Headers(); 
    headers.append('Content-type', 'application/json'); 

    return this.http 
     .post(endpoint, JSON.stringify(user), { 
     headers: headers, 
     }); 

    } 

ich auf den Anruf in meiner Komponente abonnieren:

this._accountService.login(this.user) 
     .subscribe(res => { 
      console.log("logged in!"); 
      if (res.json().status === "success") { 
       window.location.href = `/home/${this.org}/${this.product}`; 
      } 
      else { 
       // What other options are there? 
       console.log("Do something else maybe?"); 
      } 
     }, 
     err => { 
      this.invalidLogin = true; 
      console.log("Ye shall not pass!"); 
     }); 

Erfolgreiche Benutzer-Header

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:<url> 
Origin:<url> 
Referer:<url> 
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.33 Safari/537.36 

Von chrome: // net-internals/# Veranstaltungen

t=61869793 [st= 0] +REQUEST_ALIVE [dt=60162] 
         --> has_upload = false 
         --> is_pending = true 
         --> load_flags = 34624 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | MAYBE_USER_GESTURE | VERIFY_EV_CERT) 
         --> load_state = 14 (WAITING_FOR_RESPONSE) 
         --> method = "OPTIONS" 
         --> net_error = -1 (ERR_IO_PENDING) 
         --> status = "IO_PENDING" 
         --> url = "<url>" 
t=61929955 [st=60162] -HTTP_STREAM_PARSER_READ_HEADERS 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 
t=61929955 [st=60162] -HTTP_TRANSACTION_READ_HEADERS 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 
t=61929955 [st=60162] -URL_REQUEST_START_JOB 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 
t=61929955 [st=60162] URL_REQUEST_DELEGATE [dt=0] 
t=61929955 [st=60162] -REQUEST_ALIVE 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 

Ich vermute, wirklich ist dies etwas im Zusammenhang, die in meinem Browser zwischengespeichert wird (s), aber ich kann wirklich nicht das, was finden. Ich habe alle Cookies und alles, was gespeichert werden kann, gelöscht. Wo kann ich sonst noch nachsehen? Dies ist eindeutig etwas Lokales für meinen Computer/Browser (und eine andere unglückliche Person).

+0

http://stackoverflow.com/questions/10143093/origin-is-not-allowed-by-access-control-allow-origin –

+0

Dies ist nicht im Zusammenhang mit Angular. Der Server, auf den Sie zugreifen, muss CORS-Anforderungen unterstützen. 'OPTIONS' ist eine Preflight-Anfrage, die der Browser autonom durchführt. Wenn es die erwarteten 'Access-Control-Allow -...'-Header nicht zurückgibt, versucht es nicht einmal, die tatsächliche Anforderung zu senden. –

+0

@ GünterZöchbauer Ich habe CORS aktiviert. Die Anfrage funktioniert für andere Computer und Browser. – Aarmora

Antwort

2

Bitte versuchen Sie, das Observable() zu abonnieren.

return this.http 
    .post(endpoint, JSON.stringify(user), { 
    headers: headers, 
    }).subscribe(() => console.log("POST done!")); 
+0

Sorry, das ist nur mein Service, der von meiner Komponente aufgerufen wird. Meine Komponente ist abonniert. Ich sollte das klarstellen. – Aarmora

+0

@Aarmora haben Sie versucht, in den Post-Call zu treten, um zu sehen, was der letzte Schritt ist, der ausgeführt wird? – zpul

+0

Es macht den vollständigen Anruf, aber die Anfrage hängt nur an ausstehend. Es kommt kein Rückruf zurück, da die Verbindung abgelehnt wird. – Aarmora

1

Haben Sie versucht, die 'Cache-Control' in Ihren Headern zu setzen? Ich denke, in jQuery Sie einfach

$.ajax({  
    cache: false 
}); 

oder Hinzufügen eines Headers mit einem regelmäßigen Ajax-Request

request.setRequestHeader("Cache-Control", "no-cache"); 
+0

Ich hatte davon noch nichts gehört. Ich habe es einfach probiert und habe kein anderes Ergebnis bekommen. Guter Vorschlag, obwohl. – Aarmora

1

Es gibt Probleme mit CORS und mit localhost als Domain festlegen können (die Sie in der ORIGIN aufgeführt haben Kopfzeilen). Normalerweise funktionieren CORS/OPTIONS-Anfragen nicht richtig, wenn localhost aus bestimmten Sicherheitsgründen involviert ist, aber normalerweise hängt es nicht, was passiert, also ist dies vielleicht nicht die richtige Antwort, aber es lohnt sich!

Versuchen Sie, einen neuen Host zu Ihrer lokalen Maschine hinzuzufügen und localhost aus der Gleichung zu entfernen. Wirf diese Idee einfach da raus und hoffe, dass es dir helfen kann!

Wie pro Kommentar unten

Ihr Server wird die Verbindung zu erlauben, aber es scheint nicht, eine Antwort zu senden. Können Sie die Header einer erfolgreichen OPTIONS-Anfrage veröffentlichen, um zu beweisen, dass der Server diese Anforderungen tatsächlich verarbeiten kann?

+0

Leider passiert das gleiche beim Aufruf von localhost oder vom Webserver mit einer Domain und einem DNS-Set. Trotzdem danke. – Aarmora

+0

Eine andere Sache ist, dass Ihr Server keine Antwort aufgrund eines logischen Problems entweder über Cookie/Credential oder aus einem anderen Grund zurückgibt. Können Sie die POST- und OPTION-Endpunkte Ihres serverseitigen Codes hinzufügen, der diese Anforderungen verarbeitet? –

+0

Ja, der Server funktioniert gut für jeden anderen oder für mich auf Edge. Es funktioniert nur nicht in Chrome und Firefox. – Aarmora

1

Warum verhindern Sie nicht einfach in Anfrage Schleife zu gelangen. Es macht dich manchmal wirklich verrückt.Andere Browser lösen keine OPTIONS Anfrage aus, aber Chrome und Firefox sorgen dafür, dass CORS. Ich habe erfolgreich diese Bibliothek namens xdomain von GitHub verwendet, und es funktioniert wirklich !! Ihre Github-Einführungsseite stellt xdomain als CORS alternative vor. Und am wichtigsten habe ich es in JQuery verwendet, aber es unterstützt auch Angulars http Service. Schau es dir an . Es kann dir für immer helfen :). Hier ist der Link zur Bibliothek Xdomain CORS Alternative