2016-06-14 20 views
7

Faccio una richiesta POST e la richiesta rimane in attesa, finché non fallisce. Ho monitorato i log di nginx e i log del nodo server e la richiesta non è nemmeno registrata. Questo funziona per chiunque altro che ho avuto la prova tranne un altro collega. Se utilizzo il browser edge o un altro computer, funziona perfettamente.OPZIONI (non riuscito) solo su Chrome e Firefox

Ho tentato di inoltrare richieste POST ad altri server (personalizzati) e si blocca anche sulle opzioni. Ho anche fatto la richiesta POST con jQuery e fallisce allo stesso modo.

Forse vale la pena notare che sto usando il flag withCredentials.

intestazioni:

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 

La richiesta:

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, 
     }); 

    } 

mi iscrivo alla chiamata della mia componente:

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!"); 
     }); 

intestazioni dell'utente di successo

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 

Da chrome: // net-internals/# eventi

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) 

Sono davvero indovinando questo è legato a qualcosa che è memorizzato nella cache nel browser (s), ma io non riesco davvero a trovare ciò. Ho cancellato tutti i cookie e tutto ciò che potrebbe essere memorizzato. In quale altro luogo posso controllare per chiarire le cose? Questo è chiaramente qualcosa di locale per il mio computer/browser (e un'altra persona sfortunata).

+0

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

+0

Questo non è correlato a Angular. Il server che stai accedendo deve supportare le richieste CORS. 'OPTIONS' è una richiesta di verifica preliminare effettuata dal browser in modo autonomo. Se non restituisce le intestazioni previste di Access-Control-Allow -..., non tenta nemmeno di inviare la richiesta effettiva. –

+0

@ GünterZöchbauer Ho abilitato CORS. La richiesta funziona per altri computer e browser. – Aarmora

risposta

2

Si prega di provare a iscriversi() all'osservabile.

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

Siamo spiacenti, questo è solo il mio servizio, che viene chiamato dal mio componente. Il mio componente è iscritto. Dovrei chiarirlo. – Aarmora

+0

@Aarmora hai provato ad entrare nella post-call per vedere qual è l'ultimo passo che esegue? – zpul

+0

Effettua la chiamata completa ma la richiesta si blocca in attesa. Nessuna richiamata torna quando la connessione viene rifiutata. – Aarmora

1

Hai provato a impostare il "Cache-Control" nelle intestazioni? Penso che in jQuery si può semplicemente impostare

$.ajax({  
    cache: false 
}); 

o l'aggiunta di un'intestazione con una richiesta ajax regolare

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

Non ne avevo sentito parlare. L'ho appena provato e non ho ottenuto un risultato diverso. Buon suggerimento, però. – Aarmora

1

Ci sono problemi con CORS e usando localhost come il dominio (che avete elencato nel ORIGIN header). In genere le richieste CORS/OPTIONS non funzionano correttamente quando è richiesto il localhost per alcuni motivi di sicurezza, ma normalmente non è possibile appendere ciò che accade, quindi questa potrebbe non essere la risposta corretta ma vale la pena provare!

Provare ad aggiungere un nuovo host al computer locale e rimuovere localhost dall'equazione. Lancia semplicemente questa idea e spera che possa aiutarti!

Come da commento qui sotto

Il server appare per consentire la connessione, ma non sembra per inviare una risposta. Sei in grado di pubblicare le intestazioni da una richiesta OPTIONS valida per dimostrare che il server è effettivamente in grado di gestire queste richieste.

+0

Sfortunatamente questa stessa cosa accade quando si chiama da localhost o dal server web con un dominio e un set DNS. Grazie comunque. – Aarmora

+0

Un'altra cosa è che il tuo server non restituisce una risposta a causa di qualche problema logico tramite cookie/credenziali o per altri motivi. Sei in grado di aggiungere gli endpoint POST e OPTION del tuo codice lato server che gestisce queste richieste? –

+0

Sì, il server funziona correttamente per chiunque altro o per me su Edge. Funziona solo su Chrome e Firefox. – Aarmora

1

Perché non si impedisce semplicemente di entrare nel ciclo di richiesta OPTIONS. A volte ti fa impazzire.Altri browser non attivano la richiesta OPTIONS ma chrome e firefox lo fa per garantire CORS. Ho usato con successo questa libreria denominata come xdomain da github e funziona davvero !! La loro pagina di introduzione al github introduce xdomain come CORS alternative. E, cosa più importante, l'ho usato in JQuery, ma supporta anche il servizio di Angular http. Date un'occhiata a questo . Potrebbe aiutarti per bene :). Ecco il link alla libreria Xdomain CORS Alternative

Problemi correlati