xhr open how example error ejemplo javascript ajax xmlhttprequest

javascript - open - xmlhttprequest readystate



Estado de XMLHttpRequest 0(responseText está vacío) (16)

No se pueden obtener datos con XMLHttpRequest (estado 0 y responseText está vacío):

xmlhttp=new XMLHttpRequest(); xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true); xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4) alert("status " + xmlhttp.status); } xmlhttp.send();

Alerta "estado 0".

La misma situación con la solicitud localhost (cd_catalog.xml se guarda como un archivo local)

xmlhttp.open("GET","http://localhost/cd_catalog.xml", true);

Pero con la solicitud IP de host local

xmlhttp.open("GET","http://127.0.0.1/cd_catalog.xml", true);

y con la solicitud de archivo local

xmlhttp.open("GET","cd_catalog.xml", true);

todo está bien (estado 200)

¿Qué puede causar el problema (estado = 0) con la solicitud en línea?

PD: Live HTTP Headers muestra que todo está bien en los 4 casos:

HTTP/1.1 200 OK Content-Length: 4742

PS2: servidor web local Apache en VMWare (sistema operativo host Win7, sistema operativo invitado Ubuntu, adaptador de red - NAT). Navegador - Firefox.


Abra la consola de JavaScript . Verás un mensaje de error allí. En mi caso fue CORS.


Agregue setRequestHeader("Access-Control-Allow-Origin","*") a la respuesta de su servidor.


Alex Robinson y bmju proporcionaron información valiosa para comprender problemas de origen cruzado. Quería agregar que puede necesitar hacer una llamada OPCIONES explícita en su código de cliente antes de hacer el GET / POST deseado (por ejemplo, contra un punto final del servicio CORS OAuth). Su navegador / biblioteca puede no manejar automáticamente la solicitud de OPCIONES. Gruber, esta es una de las posibles respuestas a tu pregunta.


Alex Robinson ya (y primero) da la respuesta correcta a este problema. Pero para elaborarlo un poco más ...

Debe agregar el encabezado de respuesta HTTP:

Access-Control-Allow-Origin: *

Si haces esto, el resultado no es solo ''podría funcionar'', sino ''funcionará''.

NB Lo que necesita agregar es un encabezado de respuesta HTTP, por lo que solo puede hacerlo en un servidor que controle. Nunca será posible buscar http://w3schools.com/XML/cd_catalog.xml directamente desde su URL original usando XMLHttpRequest (según la pregunta de OP), porque ese recurso no (al menos, no desde el 24 de abril de 2015) ) incluir cualquier encabezado CORS.

en.wikipedia.org/wiki/Cross-origin_resource_sharing da más información.


Aquí hay otro caso en el que el status === 0 , específico para la carga:

Si adjunta un controlador de eventos ''load'' a XHR.upload , como sugiere MDN (desplácese hacia abajo hasta la parte de carga de ''Monitoring progress''), el objeto XHR tendrá status=0 y todas las otras propiedades serán cadenas vacías. Si conecta el controlador ''load'' directamente al objeto XHR, como lo haría al descargar contenido, debería estar bien (dado que no está ejecutando localhost).

Sin embargo, si desea obtener buenos datos en sus manejadores de eventos ''progress'' , debe adjuntar un manejador a XHR.upload , no directamente al objeto XHR mismo.

Hasta ahora, solo he probado esto en Chrome OSX, por lo que no estoy seguro de qué parte del problema aquí es la documentación de MDN y de la implementación de Chrome ...


Considere también el tiempo de espera de solicitud :

El navegador moderno devuelve readyState = 4 y s tatus = 0 si pasa demasiado tiempo antes de la respuesta del servidor.


En realidad, asegúrese de que su tipo de botón sea Button not Submit, que causó un conflicto de estado donde me encontré recientemente.


La causa de sus problemas es que está tratando de hacer una llamada entre dominios y falla .

Si está haciendo desarrollo de localhost, puede hacer llamadas entre dominios, lo hago todo el tiempo.

Para Firefox, debes habilitarlo en tu configuración de configuración

signed.applets.codebase_principal_support = true

A continuación, agregue algo como esto a su código abierto XHR:

if (isLocalHost()){ if (typeof(netscape) != ''undefined'' && typeof(netscape.security) != ''undefined''){ netscape.security.PrivilegeManager.enablePrivilege(''UniversalBrowserRead''); } }

Para IE, si mal no recuerdo, todo lo que tiene que hacer es habilitar la configuración de Seguridad del navegador en "Varios → Acceder a las fuentes de datos en todos los dominios" para que funcione con ActiveX XHR.

IE8 y superior también agregaron capacidades de dominio cruzado a los objetos nativos XmlHttpRequest, pero aún no jugué con ellos.


Me enfrenté a un problema similar. Todo estaba bien, el "estado listo" era 4, pero el "estado" era 0. Fue porque estaba usando un servidor portátil Apache PHP y mi archivo en el que utilicé el objeto "XMLHttpRequest" era un archivo html. Cambié la extensión de archivo a php y el problema fue resuelto.


Mi problema similar a esto fue resuelto al verificar mi código html. Estaba teniendo un controlador onclick en mi botón de enviar formulario a un método. de esta manera: onclick="sendFalconRequestWithHeaders()" . Este método a su vez llama ajax como el tuyo, y hace lo que yo quiero. Pero no como esperaba, mi navegador no devolvía nada.

Aprendido del trabajo duro de alguien , he devuelto falso en este controlador y lo he resuelto. Permítanme mencionar que antes de llegar a este post, pasé todo un fin de semana de 3 días y medio en la oficina escribiendo código implementando CORS filters , jetty config , otras cosas relacionadas con jersey and embedded jetty , solo para arreglar esto., Revolviendo todo mi entendimiento sobre cross domain ajax requests y las normas. Era ridículo cómo simples errores en javascript te hacen tonto.

Para ser cierto, he intentado signed.applets.codebase_principal_support = true y escrito isLocalHost() **if** . puede ser que este método deba ser implementado por nosotros, firefox dice que no existe. Ahora tengo que limpiar mi código para enviar el parche de git limpiamente. Gracias a eso alguien


Para responder a la pregunta de por qué http://127.0.0.1/cd_catalog.xml funciona mientras http://localhost/cd_catalog.xml no lo hace: Firefox trata a 127.0.0.1 y localhost como dos dominios diferentes.


Si el servidor responde a un método OPTIONS y GET y POST (cualquiera de ellos que esté utilizando) con un encabezado como:

Access-Control-Allow-Origin: *

Podría funcionar bien. Parece que en FireFox 3.5 y rekonq 0.4.0. Aparentemente, con ese encabezado y la respuesta inicial a OPTIONS, el servidor le dice al navegador, "Adelante y deje que se realice esta solicitud entre dominios".


Tuve el mismo problema (ReadyState fue 4 y estado 0) , luego seguí un enfoque diferente explicado en este tutorial: https://spring.io/guides/gs/consuming-rest-jquery/

Él no usó XMLHttpRequest , sino que usó el método jquery $ .ajax () :

<head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="hello.js"></script> </head> <body> <div> <p class="greeting-id">The ID is </p> <p class="greeting-content">The content is </p> </div> </body>

y para el archivo public / hello.js (o puede insertarlo en el mismo código HTML directamente):

$(document).ready(function() { $.ajax({ url: "http://rest-service.guides.spring.io/greeting" }).then(function(data) { $(''.greeting-id'').append(data.id); $(''.greeting-content'').append(data.content); }); });


Una solicitud del navegador "127.0.0.1/somefile.html" llega sin cambios al servidor web local, mientras que "localhost / somefile.html" puede llegar como "0: 0: 0: 0: 0: 0: 0: 1 / somefile.html "si IPv6 es compatible. Entonces este último se puede procesar como yendo de un dominio a otro.


el estado es 0 cuando su archivo html que contiene el script se abre en el navegador a través del esquema de archivo. Asegúrese de colocar los archivos en su servidor (apache o tomcat) y luego ábralos a través del protocolo http en el navegador. (es decir, http://localhost/myfile.html ) Esta es la solución.


Editar: Lea los comentarios de Malvolio a continuación ya que el conocimiento de esta respuesta está desactualizado.

No puede hacer XMLHttpRequests entre dominios.

La llamada a 127.0.0.1 funciona porque su página de prueba se encuentra en 127.0.0.1 , y la prueba local también funciona, ya que ... bueno, es una prueba local.

Las otras dos pruebas fallan porque JavaScript no puede comunicarse con un servidor distante a través de XMLHttpRequest.

En su lugar, podría considerar cualquiera de los siguientes:

  • XMLHttp: solicite su propio servidor para recuperar su contenido XML remoto (script php, por ejemplo)
  • Tratando de usar un servicio como GoogleAppEngine si quiere mantenerlo lleno de JavaScript.

Espero que ayude