2012-02-11 23 views
5

Pregunta breve: ¿hay alguna manera de hacer una solicitud de jsonp a un servidor, capturar la solicitud, pero no analizarla como javascript? Estoy usando dataType: "jsonp text" en jQuery 1.5 pero no está funcionando.enviar solicitud como jsonp, interpretar respuesta como texto, usando jQuery 1.5

Estoy intentando acceder a una URL entre dominios a través de AJAX con jsonp. El problema es que el otro dominio (una lista de directorios en mi universidad) es muy antiguo y dudo que el servidor admita jsonp.

  • En Firefox, aparece el error "Error de nombre de etiqueta XML (META esperado)". En Chrome obtengo un "token inesperado SyntaxError no capturado <" ambos apuntando a un archivo correspondiente a mi solicitud AJAX. La cadena de error de la devolución de llamada de error es "parsererror".
  • No puedo hacer una llamada AJAX normal: cuando cambio el tipo de datos a solo "texto" o lo elimino todo, el otro dominio se queja de que el usuario no está autenticado y lo redirecciona a una página de inicio de sesión, incluso si Ya he iniciado sesión en el lado del navegador. Cuando dataType es jsonp, esto no sucede.
  • Sé que el servidor necesita ser compatible con JSONP, y no creo que lo haga, pero cuando cambio dataType a JSONP, veo que los recursos de la página de respuesta aparecen tanto en Chrome como en Firefox, por lo que el servidor realmente envía la respuesta al navegador (una página web HTML estática + algunas secuencias de comandos java) - que contiene los datos que quiero obtener.
  • El problema es que jQuery está intentando analizar la respuesta como javascript y falla (porque no es javascript). Entonces los datos terminan en el navegador, ¡solo necesito acceder!
  • Usando dataType: "jsonp text", que se supone que indica enviar una solicitud jsonp e interpretar la respuesta como texto no hace diferencia, sigue siendo un error de análisis.

Lo que quiero es: una forma de acceder a la respuesta de una solicitud jsonp como texto sin formato. O bien, si puedo acceder a la respuesta sin procesar de una solicitud jsonp fallida, eso también funcionaría.

¡Gracias de antemano!

Código:

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

¿Ha intentado poner los datos a su acceso en una variable js, luego encerrándola en etiquetas js. Parece tener sentido si está intentando analizarlo como js. –

Respuesta

8

Lo que estamos tratando de lograr no funcionará: jsonp sólo se puede utilizar siempre y cuando el servidor de integrar adecuadamente la respuesta en una llamada a una función JavaScript.

Aunque el servidor envía el archivo al navegador, no podrá acceder a él debido a limitaciones de seguridad: todo lo que puede hacer es ejecutar dichos datos como un script (con una etiqueta de script) o usarlo como una hoja de estilo (usando una etiqueta de enlace) pero nunca, nunca podrá inspeccionar la respuesta en texto sin procesar si es de otro dominio.

Supongo que trataste de obtener los datos como xml directamente y que fallaron (lo que significa que el sitio no es compatible con CORS). Si no puede cambiar el lado del servidor de código, a continuación, sólo tiene dos alternativas:

  1. crear un proxy en su propio servidor que lo haría túnel de la respuesta (el script del lado del servidor hace que la solicitud real y lo envía al navegador): el mismo dominio se aplicará desde el punto de vista del cliente y podrá solicitar datos como XML,
  2. Utilice el flash para eludir la seguridad del navegador (puede usar flXHR pero parece estar un poco anticuado ahora) .
+0

¡Gracias! Por desgracia, esto es lo que sospechaba. Leí acerca de CORS (el servidor definitivamente no lo admite) y la misma política de origen, y en retrospectiva, tiene sentido que incluso si el servidor envía la respuesta a jsonp, no podría inspeccionarlo. Consideré hacer la opción 1 (proxying a través de mi propio servidor) pero desafortunadamente necesito que el cliente sea autenticado. Le daré una oportunidad a flXHR. Gracias de nuevo. –

+0

En relación con el navegador/flash de autenticación de cliente, puede encontrar la siguiente pregunta de interés: http://stackoverflow.com/questions/2161401/does-flash-player-transmit-session-cookies-automatically –

Cuestiones relacionadas