2010-08-05 21 views
5

Sto avendo qualche problema con condivisione delle risorse Croce Origine e Prototype. Ho una semplice richiesta POST a una risorsa straniera, e per una semplice richiesta di posta ci sono alcune regole che devono essere soddisfatte:condivisione delle risorse Croce origine con PrototypeJS

il Content-Type deve essere su di application/x-www-form-urlencoded, multipart/form-data, o text/plain, una semplice richiesta non imposta intestazioni personalizzate con la richiesta http e il server deve impostare l'intestazione Access-Control-Allow-Origin corretta.

con un vaniglia JavaScript XMLHttpRequest tutto funziona bene ma con PrototypeJS non funzionerà perché si inserisce Prototype imposta alcune intestazioni personalizzate e non so come prevenirlo.

ho provato in Prototype via:

new Ajax.Request('some.foreign-host.com/res.php', { 
    method: 'post', 
    postBody: 'foo=bar', 
    contentType: 'application/x-www-form-urlencoded', 
    onSuccess: function(e){ 
    // some custom code 
    } 
}); 

Qualsiasi idea di come raggiungere prototipo per inviare un tale semplice richiesta CORS?


Ho una discarica delle intestazioni create da una pianura JavaScript XMLHttpRequest:

POST /bthesis/returnJSON.php HTTP/1.1  
Host: foreign-host.com       
Connection: keep-alive     
Referer: this-host.com 
Content-Length: 9       
Origin: this-host.com  
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Accept: */*        
User-Agent: [...] 
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

e le intestazioni create da un prototipo Richiesta:

OPTIONS /bthesis/returnJSON.php HTTP/1.1 
Host: foreign-host.com       
Connection: keep-alive     
Referer: this-host.com 
Access-Control-Request-Method: POST  
Origin: this-host.com  
Access-Control-Request-Headers: X-Prototype-Version, X-Requested-With, Content-type, Accept 
Accept: */*        
User-Agent: [...] 
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

usi Prototype un set di intestazione completamente diverso ... che porta al seguente errore nella console:

XMLHttpRequest non può caricare foreign-host.com/bthesis/returnJSON.php. Campo di intestazione richiesta X-Prototype: la versione non è consentita da Access-Control-Allow-Headers. Rifiutato per ottenere un'intestazione non sicura "X-JSON"

La cosa strana è che il server Web restituisce in entrambi i casi la risorsa richiesta (lo vedo nella vista "Risorse" della console di sviluppo in chrome) ma le cuciture quel prototipo non ha accesso ad essa in qualche modo

risposta

0

Forse è possibile impostare l'intestazione di origine se stessi nella richiesta AJAX, in questo modo

new Ajax.Request('some.foreign-host.com/res.php', { 
    method: 'post', 
    postBody: 'foo=bar', 
    requestHeaders: {Origin: 'http://www.my.local-host.com'} 
    contentType: 'application/x-www-form-urlencoded', 
    onSuccess: function(e){ 
     // some custom code 
    } 
}); 

Mai provato io stesso però ... Cosa succede con la versione prototipo? Viene emessa una richiesta e quindi non ritorna nulla, o viene scartata una risposta, o cosa?

1

prega di dare un'occhiata al PREFLIGHT qui https://developer.mozilla.org/En/HTTP_access_control

Il tuo problema è che Fx sta reagendo alle intestazioni personalizzate (X -...) e si innescherà preflight. È necessario che il server restituisca tutte le intestazioni di controllo degli accessi per OPTIONS e POST e consenta l'uso di intestazioni personalizzate.

11

Ho lo stesso problema.Il @mplungjan link condiviso contiene la risposta:

Devi semplicemente lasciare che il browser sa che l'intestazione x-json è sicuro utilizzando il access-control-expose-headers

sto usando questa linea in Ruby on Rails regolatore

headers['Access-Control-Expose-Headers'] = 'x-json' 

(questo dovrebbe essere abbastanza facile da tradurre in altri linguaggi di programmazione :))

Maggiori dettagli su questo page

+1

Questo ha funzionato per me. Grazie – FosAvance

1

Ho trovato la soluzione su other SO question. E funziona per me - details are here.

Riassumendo - è necessario onCreate evento nella tua Ajax.Request che rimuove le intestazioni non standard:

onCreate: function(response) { // here comes the fix 
     var t = response.transport; 
     t.setRequestHeader = t.setRequestHeader.wrap(function(original, k, v) { 
      if (/^(accept|accept-language|content-language)$/i.test(k)) 
       return original(k, v); 
      if (/^content-type$/i.test(k) && 
       /^(application\/x-www-form-urlencoded|multipart\/form-data|text\/plain)(;.+)?$/i.test(v)) 
       return original(k, v); 
      return; 
     }); 
    } 
Problemi correlati