2011-04-14 15 views
10

obtengo el código de estado 0 ... pero es el código 403. ¿Puede alguien decirme cuál es el problema?jqXHR - http-status-code-403 (pero el código de estado es 0)

JQUERY

var jqxhr = $.ajax({ 
     url: 'http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json', 
     dataType: 'json' 
    }).success(function(xhr) { 
     alert(xhr.status); 
    }).error(function(xhr) { 
     alert(xhr.status); 
     return false; 
    }) 

DEMO ->http://jsfiddle.net/QFuBr/

Gracias de antemano!
Peter

+0

Ahora sería un buen momento para otorgar la recompensa. –

Respuesta

17

El servidor da un error 403 a un navegador, porque no tiene permiso para acceder al recurso, por el mensaje de error reportado ("Favoritos de usuario solicitado no son públicos.").

Sin embargo, el servidor ni siquiera obtiene la solicitud en el ejemplo de jsFiddle.

No tiene permitido realizar solicitudes AJAX entre navegadores. Esto se llama same-origin policy. Es por razones de seguridad, para evitar que codificadores malintencionados hagan cosas desagradables sin su conocimiento. Es una herramienta contundente, pero efectiva.

Cuando no llega siquiera a enviar una solicitud al servidor, no hay un código de estado. Esto se informa mediante el objeto XMLHTTPRequest (y su envoltorio jqXHR) como 0.

Básicamente, no puede hacer lo que está tratando de hacer en el navegador.

Si necesita que el navegador acceda a datos como este de forma asincrónica, deberá escribir un contenedor en su servidor para obtener la información del servidor remoto y pasarla al navegador. Hay una solución alternativa (se llama JSONP – JSON con relleno) pero no creo que YouTube lo admita.


Editar: Por gradbot's answer, es posible hacer una solicitud JSONP cambiar su código para establecer dataType a jsonp.

Sin embargo, ahora no podrá usar xhr.status. Esto se debe a que JSONP no utiliza el objeto XHR, por lo que no hay estado disponible para verificar.

Here's a working example using the feed gradbot suggested. Tenga en cuenta que el objeto resultante se pasa al manejador, en lugar del objeto jqXHR.

+0

Correcto, xhr no se usa y jsonp funciona insertando un elemento de script en el dom. – gradbot

+1

CORS (Cross Origin Resource Sharing) ahora también es una opción admitida por la mayoría de los navegadores más nuevos para permitir solicitudes AJAX entre dominios. Consulte http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing y https://developer.mozilla.org/en-US/docs/HTTP_access_control y http://caniuse.com/#search=cors –

2

Debe configurar dataType: "jsonp" y debe iniciar sesión como el usuario que está tratando de obtener. En este caso, utilizo mi propio nombre de usuario grabot y la alerta vuelve como un éxito.

Si usted no tiene una cookie válida para la cuenta de su tratando de acceder entonces la llamada a la API devolverá un 403 con el contenido "Favorites of requested user are not public."

$(function() { 
    var jqxhr = $.ajax({ 
     url: 'http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json', 
     dataType: 'jsonp' 
    }).success(function(data, status) { 
     alert(status); 
    }).error(function(xhr) { 
     alert(xhr.status); 
    }) 
}); 
+1

que ganó no funciona si el servidor no lo admite – lonesomeday

+0

youtube sí lo admite. – gradbot

+0

Es posible que desee mostrar cómo, entonces, porque [el cambio que sugiere] (http://jsfiddle.net/QFuBr/1/) no mejora las cosas. – lonesomeday

0

No se puede hacer peticiones entre dominios (sea GET o POST) debido a restricciones de seguridad en la mayoría de los navegadores modernos.

Si aún desea obtener datos de otro dominio, considere usar un proxy inverso que instale en su servidor y envíe todas las solicitudes. Para el navegador, parecerá que los datos provienen del mismo dominio.

Uno de los más populares es mod_reverse en Apache, pero existen otras alternativas según el entorno del servidor.

Otra alternativa es utilizar el JSONP si la API de Google lo admite.

1

El 403 se debe a que necesita proporcionar credenciales para el usuario cuyos videos se están accediendo. Suponiendo que se proporcionen las credenciales correctas, la solicitud seguirá fallando debido a restricciones entre dominios.

En la mayoría de los casos, el código de estado 0 implica que la solicitud no se pudo enviar al servidor. Esto es lo que muestran los registros de la consola de Chrome para tu ejemplo de violín.

XMLHttpRequest no se puede cargar http://gdata.youtube.com/feeds/api/users/bernd/favorites?alt=json. El origen http://fiddle.jshell.net no está permitido por Access-Control-Allow-Origin.

Youtube, en el hecho all Google Data API's apoyo JSONP pero para usarlo, usted tiene que pasar un parámetro con el valor altjson-in-script y especifique la dataType como jsonp. jQuery le proporcionará el parámetro de devolución de llamada. Según las pruebas empíricas, parece que a Youtube no le importa el parámetro alt para ser específicamente json-in-script. Siempre que se especifique un parámetro callback, el parámetro alt solo puede tomar el valor json.

http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json http://gdata.youtube.com/feeds/api/users/gradbot/favorites?alt=json&callback=foo

Aquí hay una working example para una alimentación accesible al público.

$.ajax({ 
    url: 'http://gdata.youtube.com/feeds/mobile/videos?alt=json-in-script', 
    dataType: 'jsonp', 
    success: function(data) { 
     // do something with data 
    } 
}); 
Cuestiones relacionadas