2012-02-11 8 views
5

Domanda breve: c'è un modo per fare una richiesta jsonp a un server, catturare la richiesta, ma non analizzarla come javascript? Sto usando dataType: "jsonp text" in jQuery 1.5 ma non funziona.invia richiesta come jsonp, interpreta la risposta come testo, usando jQuery 1.5

Sto tentando di accedere a un URL tra domini tramite AJAX con jsonp. Il problema è che l'altro dominio (un elenco di directory nella mia università) è molto vecchio e dubito che il server supporti jsonp.

  • In Firefox, viene visualizzato un errore "Nome tag XML non corrispondente (previsto META)". In chrome ottengo un "Token imprevisto Uncaught SyntaxError <" che punta a un file corrispondente alla mia richiesta AJAX. La stringa di errore dal callback dell'errore è "parsererror".
  • Non riesco a effettuare una normale chiamata AJAX: quando cambio il tipo di dati in "solo testo" o lo rimuovi tutti insieme, l'altro dominio si lamenta che l'utente non è autenticato e reindirizza a una pagina di accesso, anche se Ho già effettuato l'accesso al browser. Quando dataType è jsonp, questo non accade.
  • So che il server deve supportare JSONP, e non penso che lo faccia, ma quando cambio dataType in JSONP, posso vedere le risorse della pagina di risposta mostrate sia in Chrome che in Firefox - così il server effettivamente invia la risposta al browser (una pagina Web HTML statica + un po 'di script java) - che contiene i dati che voglio ottenere.
  • Il problema è che jQuery sta cercando di analizzare la risposta come javascript e fallisce (perché non è javascript). Quindi i dati finiscono nel browser - ho solo bisogno di accedervi!
  • Utilizzo di dataType: "jsonp text" che dovrebbe indicare di inviare una richiesta jsonp e interpretare la risposta in quanto il testo non fa alcuna differenza, tuttavia un errore di analisi.

Quello che voglio è: un modo per accedere alla risposta da una richiesta jsonp come testo normale. Oppure, se riesco ad accedere alla risposta non elaborata da una richiesta jsonp fallita, anche questo funzionerebbe.

Grazie in anticipo!

Codice:

ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname'; 
var jqxhr = $.ajax({type:"GET", 
url: ajax_url, 
dataType:"jsonp text", 
callback: "whatever", 
success:function(responseData) { 
    $('div#content').text(responseData.slice(0, 100)); 
    dbg(responseData.slice(0,100)); 
}}) 
.success(function() { alert("success"); }) 
.error(function(obj, errStr) { alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);}) 
.complete(function() { alert("complete"); }); 
+0

Hai provato a inserire i dati in una variabile js, quindi racchiuderlo in tag js. Sembra avere senso se sta cercando di analizzarlo come js. –

risposta

8

quello che stai cercando di raggiungere non funzionerà: jsonp può essere utilizzato solo se e quando il server correttamente incorporare la risposta a una chiamata di funzione javascript.

Anche se il server invia il file al browser, non sarà possibile accedervi a causa di limitazioni di sicurezza: tutto ciò che si può fare è eseguire detti dati come script (con un tag script) o usarlo come un foglio di stile (usando un tag link) ma non sarai mai e poi mai in grado di ispezionare la risposta in testo non elaborato se proviene da un altro dominio.

Suppongo che si sia tentato di ottenere i dati come xml direttamente e che non sia riuscito (il che significa che il sito non supporta CORS). Se non è possibile modificare il codice lato server, allora si hanno solo due alternative:

  1. creare un proxy sul proprio server che avrebbe tunnel la risposta (lo script lato server effettua la richiesta attuale e lo invia al browser): lo stesso dominio verrà quindi applicato dal punto di vista del cliente e sarà possibile richiedere dati in formato XML,
  2. Utilizzare il flash per ignorare la sicurezza del browser (è possibile utilizzare flXHR ma sembra essere un po 'datato ora) .
+0

Grazie! Ahimè, questo è quello che sospettavo. Ho letto su CORS (il server sicuramente non lo supporta) e la stessa politica di origine, e in retrospettiva ha senso che anche se il server invia la risposta a jsonp, non sarei in grado di ispezionarlo. Ho pensato di fare l'opzione 1 (proxy attraverso il mio server) ma purtroppo ho bisogno che il client sia autenticato. Darò un colpo a flXHR. Grazie ancora. –

+0

Per quanto riguarda il browser di autenticazione client/flash, è possibile trovare la seguente domanda di interesse: http://stackoverflow.com/questions/2161401/does-flash-player-transmit-session-cookies-automatically –