2011-03-09 21 views
5

Estoy escribiendo una aplicación y necesito acceder a algunos datos json en el lado del cliente desde otro servidor. Debido al problema del dominio cruzado, planeo usar jsonp. jQuery me permite hacer esto usando el método $ .getJSON(), sin embargo, no tengo forma de saber si el método ha fallado (es decir, el servidor no responde o algo así). Así que probé el enfoque para obtener los datos JSON utilizando $ .ajax en su lugar. Pero no está funcionando y no sé qué probar. Aquí un ejemplo que muestra mi problema:jQuery ajax request using jsonp error

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
     <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
     <title>TEST</title> 
     <script type="text/javascript" src="scripts/jquery-1.5.1.min.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
     $('#button_detect').click(function(){ 
      var feedApiAjax = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q='; 
      var feedApiGetJSON = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q='; 
      var feedUrl = 'http://www.engadget.com/rss.xml'; 

      $.ajax({ 
       url: feedApiAjax + feedUrl, 
       datatype: 'jsonp', 
       success: function(data) { 
        console.log('$.ajax() success'); 
       }, 
       error: function(xhr, testStatus, error) { 
        console.log('$.ajax() error'); 
       } 
      }); 

      $.getJSON(
       feedApiGetJSON + feedUrl, 
       function(data) { 
        console.log('$.getJSON success'); 
       }); 
     }); 
    }); 
     </script> 
</head> 
<body> 
     <div id="button_detect">CLICK ME!!!!</div> 
</body> 

Si crea una página web con este código y hacer clic en "Click Me" div verá que la solicitud $ .getJSON está funcionando y el $ .Ajax no es. He intentado poner/eliminar la "devolución de llamada =?" tg, usó los tipos de datos "jsonp" y "json", pero no funcionó.

¿Alguna idea sobre qué podría estar haciendo mal?

¡Salud!

+0

Probablemente también debería verificar dos veces para asegurarse de que 'feedUrl' no necesita ser codificado en porcentaje para la solicitud. –

Respuesta

5

me encontré con este error antes, y resolvió después de usar jquery-JSONP

[Ejemplo]

$.getJSON('http://server-url/Handler.ashx/?Callback=DocumentReadStatus', 
    { 
     userID: vuserID, 
     documentID: vdocumentID 
    }, 
    function(result) { 
     if (result.readStatus == '1') { 
      alert("ACCEPTED"); 
     } 
     else if (result.readStatus == '0') { 
      alert("NOT ACCEPTED"); 
     } 
     else { 
      alert(result.readStatus); 
     } 
    }); 
+0

Esto podría ser una solución, pero al usar esto no tengo forma de saber si la llamada falló (solo proporciona una devolución de llamada si la llamada tiene éxito). ¿Alguna idea sobre cómo detectar si la llamada falló? – brafales

+1

@Brafales: una de las características de JQuery JSONP es la recuperación de errores, consulte el siguiente enlace http://code.google.com/p/jquery-jsonp/wiki/TipsAndTricks para la sección "Uso simple". Puede proporcionar fácilmente un mensaje de error si se produce un error. – Ahmed

+0

¡Bien, gracias a los dos por las actualizaciones! – brafales

2

para analizar las alimentaciones externas, y la captura de los posibles errores, puede utilizar esta

function GetContent(feedUrl) 
    { 
     var feedApiGetJSON = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q='; 
      $.ajax({ 
       url: feedApiGetJSON + feedUrl, 
       dataType: 'jsonp', 
       jsonpCallback: 'JsonpCallback' 
      }); 
    } 

    function JsonpCallback(data) { 
     if (data.responseStatus == "200") 
      alert(data.responseData.feed.title); 
     else 
      alert(data.responseDetails); 
+0

esto no funciona cuando el responseStatus es 500 – Adaptabi

1

Reemplazar: tipo de datos con dataType

7

Cuando el tipo de datos es jsonp, jquery no activará la función de error automáticamente. Esto se describe en la documentación bajo la opción de "error":

Nota: Este controlador no es llamado para la escritura de varios dominios y JSONP solicitudes. see here.

La solución consiste en especificar explícitamente un tiempo de espera como opción. Si el servidor no responde en el período de tiempo especificado, se invocará la función de error. Más sobre esto here.

+0

¿Este no parece ser el caso con jQuery 2.0? – andig

Cuestiones relacionadas