2016-04-02 21 views
5

Devo effettuare chiamate di servizi Web dai miei siti Web a dominio/server di terze parti. Mentre sto facendo questa chiamata usando il metodo jQuery Ajax by Post con content-type: text/plain e sta funzionando bene.Chiamate incrociate che funzionano con Posta ma falliscono con il pre-volo

Ma mentre sto cambiando a Content-Type: text/xml si sta gettando:

risposta alla richiesta di verifica preliminare non passa di controllo di controllo di accesso: No 'Access-Control-Allow-Origin L'intestazione è presente sulla risorsa richiesta.

Anche impostato su server di terze parti per consentire l'accesso al nostro sito web. E stiamo ricevendo questa intestazione mentre facciamo call con content-type: text/plain.

Abbiamo anche aggiunto il seguente server Terzo.

Access-Control-Allow-Methods : Get , Post , Options ,PUT 

Access-Control-Allow-Headers: Authorization,origin, content-type, accept 

prega fatemi sapere cosa potrebbe essere la ragione per cui richiesta di pre-volo non è sempre 'Access-Control-Allow-Origin' in risposta?

+0

ho cambiato il servizio di sapone per il servizio Riposo e ora chiamate Opzioni stanno avendo tutti i dati obbligatori di controllo-ACCESS * intestazione. Non so cosa c'è di sbagliato in Soap Call. – yashpal

risposta

0

Il motivo per cui il tuo script funziona per text/plain è perché è una semplice richiesta. Se guardi allo this answer, puoi vedere che la tua richiesta text/plain soddisfa i requisiti per una semplice richiesta. Tuttavia, quando si modifica il tipo di contenuto in text/xml, lo si trasforma in una richiesta "non semplice".

Al fine di rendere operativa la richiesta "non semplice", è necessario esaminare come effettuare una richiesta di pre-volo. This website spiega come farlo in "Gestione di una richiesta non tanto semplice".

Aggiornamento

Solo due parole: Il Access-Control-Allow-Methods è gettato sensibile (tutto maiuscolo), e non c'è bisogno di elencare i metodi utilizzati per una semplice richiesta (GET, HEAD, POST). - source

Access-Control-Allow-Methods: OPTIONS, PUT 
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept 

Firefox non include un header Origin sulle richieste dello stesso origine. Ma Chrome e Safari includono un'intestazione Origin su richieste POST/PUT/DELETE di origine (le richieste GET della stessa origine non avranno un'intestazione Origin).

Esiste la possibilità che l'origine sia la stessa?

Potrebbe esserci un problema con il tuo caching?

Accertarsi che siano presenti questi settings per il vostro jquery chiamata AJAX:

crossDomain: true // Will force a cross domain request 
cache: false 
+0

Sì, lo so che è una richiesta semplice e l'altra è "richiesta non tanto semplice". La domanda è che in una richiesta ottengo tutte le intestazioni di accesso-controllo- * ma nell'opzione I non sto ottenendo queste intestazioni. quindi la mia "richiesta non tanto semplice" sta fallendo. – yashpal

+0

@yashpal Ho aggiornato la mia risposta. – GreeKatrina

0

La differenza tra content-type:text/plain e content-type: text/xml è: "text/xml" richiede "preflight", ma "text/plain" non lo fa.

Da MDN:

In particolare, una richiesta viene preflight se:

Esso utilizza metodi diversi da GET, HEAD o POST. Inoltre, se il POST viene utilizzato per inviare dati richiesta con un Content-Type diverso application/x-www-form-urlencoded, multipart/form-data, o text/plain, per esempio se la richiesta POST invia un payload XML al server utilizzando application/xml o text/xml, quindi la richiesta viene preflight.

Alcuni potenziali motivi di queste possono causare l'fail di una richiesta di verifica preliminare:

  1. CORS non è abilitata per server. Cerca come abilitare CORS per la tua tecnologia server.
  2. Server non consuma una richiesta diversa da "text/plain". Per esempio; Spring ha un consume option che definisce quale tipo di contenuto è accettabile.
  3. C'è un "Autorizzazione" intestazione nel tuo post. Se si inviano richieste con credenziali, è necessario aggiungere anche l'intestazione Access-Control-Allow-Credentials: true. Di nuovo da MDN.