2009-12-21 28 views
25

He escrito un XMLHttpRequest que funciona bien pero devuelve un texto de respuesta vacío.Empty responseText from XMLHttpRequest

El javascript es el siguiente:

var anUrl = "http://api.xxx.com/rates/csv/rates.txt"; 
    var myRequest = new XMLHttpRequest(); 

    callAjax(anUrl); 

    function callAjax(url) { 
    myRequest.open("GET", url, true); 
    myRequest.onreadystatechange = responseAjax; 
       myRequest.setRequestHeader("Cache-Control", "no-cache"); 
    myRequest.send(null); 
    } 

    function responseAjax() { 
    if(myRequest.readyState == 4) { 
     if(myRequest.status == 200) { 
      result = myRequest.responseText; 
      alert(result); 
      alert("we made it"); 
     } else { 
      alert(" An error has occurred: " + myRequest.statusText); 
     } 
    } 
    } 

El código funciona muy bien. Puedo avanzar y obtengo ReadyState == 4 y un estado == 200 pero el responseText siempre está en blanco.

Aparece un error de registro (en la depuración de Safari) de Error dispatching: getProperties al que no puedo encontrar referencia.

He ejecutado el código en Safari y Firefox tanto localmente como en un servidor remoto.

La dirección URL cuando se ponen en un navegador devolverá la cadena y dar un código de estado de 200.

escribí un código similar a la misma URL en un widget Mac que funciona bien, pero el mismo código en un navegador nunca devuelve un resultado

+3

algo que he descubierto que llevó a parte de mi confusión inicial es que Safari tiene un modelo de seguridad modificado que permite que los archivos que se ejecutan localmente en el acceso solicitudes de cualquier origen Esto se hizo para que las solicitudes de acceso frío de Dashboard Widgets. Inicialmente, escribí un widget, eso funcionaría, y luego, cuando no usaba Safari o desde la máquina local, no lo hacía. Sin embargo, acabo de encontrar este ajuste. – PurplePilot

Respuesta

25

¿Es http://api.xxx.com/ parte de su dominio? Si no, estás siendo bloqueado por el same origin policy.

Es posible que desee echa un vistazo a la siguiente mensaje de desbordamiento de pila para algunas soluciones posibles:

+0

tuve la sensación de que podría ser. El aspecto desconcertante de esto es que en un Widget de Mac utilicé XMLHttpRequest para hacer lo mismo y funciona. Supongo que en el caso del widget no estoy en un navegador, así que no estoy bloqueado. – PurplePilot

+2

En realidad, esto no tiene nada que ver con xss, que es causado por la falla al validar la entrada del usuario. El uso de XHR para acceder a otro dominio es una violación de la Política de mismo origen: http://code.google.com/p/browsersec/wiki/Part2 – rook

+0

@The Rook: gracias por la nota. Solucionado mi respuesta. –

4

El navegador que impide cross-site scripting.

Si la url está fuera de su dominio, entonces necesita hacer esto en el lado del servidor o moverlo a su dominio.

11

problema resuelto

En mi caso, el problema era que yo hago la llamada AJAX (con $ .ajax, .get $ o $ .getJSON métodos de jQuery) con ruta completa en el parámetro url :

url: "http://mydomain.com/site/cgi-bin/serverApp.php"

Pero la forma correcta es para pasar el valor de URL como:

url: "sitio/cgi-bin/serverApp.php"

Algunos navegador no entran en conflicto y no hacen ninguna distiction entre un texto u otro, pero en Firefox 3.6 para Mac OS aprovechar esta ruta completa como "cross site scripting" ...otra cosa, en el mismo navegador hay una distinción entre:

http://mydomain.com/site/index.html

Y poner

http://www.mydomain.com/site/index.html

De hecho, es el punto de vista correcto, pero la mayoría de las implementaciones no hacen distinción, por lo la solución era eliminar todo el texto que especifica el ruta completa al script en los métodos que hacen la solicitud ajax Y .... eliminar BASE etiqueta en el archivo index.html

base href = "http://mydomain.com/" < --- mala idea, eliminarlo!

Si no lo elimina, esta versión del navegador de este sistema puede tomar su solicitud de AJAX como si fuera una solicitud cruzada.

que tienen el mismo problema, pero sólo en la máquina Mac OS. El problema es que Firefox trata la respuesta ajax como una llamada "cross site", en cualquier otra máquina/navegador funciona bien. No se ha encontrado ningún ayuda sobre esto (creo que es un problema de implementación Firefox), pero voy a probar el siguiente código en el lado del servidor:

header('Content-type: application/json'); 

para asegurar que el navegador obtener los datos como "los datos JSON" ...

+0

Agregando encabezado de respuesta Content-Type: application/json funcionó para mí. –

1

Esto podría no ser la mejor manera de hacerlo. Pero de alguna manera funcionó para mí, así que voy a correr con eso.

En mi función php que devuelve los datos, una línea antes de la línea de retorno, agrego una declaración de eco, haciendo eco de los datos que deseo enviar.

Ahora estoy seguro de por qué funcionó, pero lo hizo.

Cuestiones relacionadas