2011-02-16 20 views
21

¿Hay alguna forma de detectar un error causado por Access-Control-Allow-Origin al realizar una solicitud? Estoy usando jQuery, y el controlador establecido en .ajaxError() nunca se llama porque la solicitud nunca se hace para comenzar.Captura de errores HTTPHttpRequest de dominio cruzado

¿Hay alguna solución?

+0

información posiblemente útil: [Detección de errores con XMLHttpRequest] (http://ajaxpatterns.org/XMLHttpRequest_Call #Detecting_Errors) – drudge

Respuesta

18

Para solicitudes CORS, el controlador onError de XmlHttpRequest debe activarse. Si usted tiene acceso al objeto XmlHttpRequest cruda, intente configurar un controlador de eventos como:

function createCORSRequest(method, url){ 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr){ 
    xhr.open(method, url, true); 
    } else if (typeof XDomainRequest != "undefined"){ 
    xhr = new XDomainRequest(); 
    xhr.open(method, url); 
    } else { 
    xhr = null; 
    } 
    return xhr; 
} 

var url = 'YOUR URL HERE'; 
var xhr = createCORSRequest('GET', url); 
xhr.onerror = function() { alert('error'); }; 
xhr.onload = function() { alert('success'); }; 
xhr.send(); 

Nota: algunas cosas

  • En las solicitudes CORS, console.log del navegador mostrará un mensaje de error . Sin embargo, ese mensaje de error no está disponible para su código JavaScript (creo que esto se hace por razones de seguridad, hice esta pregunta una vez antes: Is it possible to trap CORS errors?).

  • xhr.status y xhr.statusText no están establecidos en el controlador onError, por lo que realmente no tiene ninguna información útil sobre por qué falló la solicitud CORS. Solo sabes que falló.

+2

Ah, pero ¿cómo se distinguen los errores causados ​​por las restricciones CORS de otros errores AJAX no especificados? No parece haber nada discernible en las propiedades 'readyState',' status' y 'statusText' de un objeto XMLHttpRequest que falló debido a CORS. – kpozin

+0

No creo que sea posible, consulte esta pregunta: http://stackoverflow.com/questions/4844643/is-it-possible-to-trap-cors-errors – monsur

+0

XDomainRequest está en desuso – mate64

2

Establecer un controlador para onerror y usted será capaz de detectar las excepciones entre dominios. No sé por qué se activó el evento onerror para excepciones y no el evento error, pero lo probé y funcionó.

req = $.get('http://www.example.com'); 
req.onerror = function() { alert('An exception occurred.') }; 
+0

así es como funciona js, 'req .onerror = function() {..} 'es equivalente a' req.addEventListener ('error', function() {..}) ' – felixfbecker

5

Es posible conseguir un estado de error, así:

xhr.onerror = function(e) { 
    alert("Error Status: " + e.target.status); 
}; 

Fuente: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

+4

-1 No veo nada como eso en su referencia, y de hecho no debería haber ningún código de estado en 'onError'. 'onError' solo se activa en fallas de red, y si tiene un código de estado eso significa que la respuesta se recibió con éxito. –