Utilizo las funciones de jQuery ajax para acceder a un servicio web, pero el servidor, en lugar de devolver una respuesta con un código de estado que describe un problema, la solicitud se redirige a una página con un encabezado 200, que describe el problema. No puedo hacer ningún cambio en esto, así que necesito resolverlo en el cliente de alguna manera.
Ejemplo: una solicitud va a alguna URL que no se encuentra, por lo que recibo un redireccionamiento 302 a otra ubicación. Se envía una nueva solicitud y recibo 200 OK, evitando así que se active la devolución de llamada de error.
¿Hay alguna manera de evitar que la solicitud ajax siga las redirecciones y, en su lugar, invoque una devolución de llamada, preferiblemente el método de error? Alternativamente, ¿es posible detectar si se ha producido una redirección en el cliente?
fuente
Respuestas:
Encuentro su pregunta interesante, pero el problema en su conjunto me parece más un malentendido. Al menos intentaré explicar mi comprensión del problema.
La redirección silenciosa (transparente) es parte de la
XMLHttpRequest
especificación (vea aquí especialmente las palabras "... siga de forma transparente la redirección ..."). El estándar solo menciona que el agente de usuario (el navegador web) puede prevenir o notificar ciertos tipos de redirecciones automáticas, pero no es parte deXMLHttpRequest
. Es parte de la configuración del cliente HTTP (configuración del sistema operativo) o la configuración del navegador web. PorjQuery.ajax
lo tanto , no puede tener ninguna opción en la que pueda evitar la redirección.Puede ver que la redirección HTTP es parte del protocolo HTTP y no parte de
XMLHttpRequest
. Así que está en otro nivel de abstracción o pila de red. Por ejemplo, los datos delXMLHttpRequest
se pueden recuperar del proxy HTTP o del caché del navegador local, y es parte del protocolo HTTP. Principalmente, el servidor que proporciona los datos y no el cliente puede influir en el almacenamiento en caché.Puede comparar el requisito de su pregunta con el requisito de evitar el cambio de la dirección IP del servidor web o el cambio de la ruta IP durante la comunicación. Todas las cosas pueden ser interesantes en algunos escenarios, pero hay partes de otro nivel de la pila de comunicación y no pueden ser administradas por
jQuery.ajax
oXMLHttpRequest
.El
XMLHttpRequest
estándar dice que la configuración del cliente puede tener opciones que eviten la redirección. En el caso del "mundo de Microsoft", que conozco mejor, puede mirar la función WinHttpSetOption que se puede usar para establecer laWINHTTP_OPTION_DISABLE_FEATURE
opción con elWINHTTP_DISABLE_REDIRECTS
valor. Otra forma es el uso de laWINHTTP_OPTION_REDIRECT_POLICY
opción con elWINHTTP_OPTION_REDIRECT_POLICY_NEVER
valor. Una característica más que se puede usar en Windows es la función WinHttpSetStatusCallback que puede configurar la función de devolución de llamada que recibió algunas notificaciones comoWINHTTP_CALLBACK_FLAG_REDIRECT
.Por lo tanto, es posible implementar sus requisitos en general, pero la solución probablemente no será independiente del sistema operativo o del navegador web y no estará al nivel de
jQuery.ajax
oXMLHttpRequest
.fuente
No creo que sea posible. La biblioteca subyacente (XHR) realiza la nueva solicitud de forma transparente. Dicho esto, lo que he hecho en estas situaciones (generalmente un tipo de trato de tiempo de espera de sesión que me lleva a una página de inicio de sesión) es enviar un encabezado de respuesta personalizado. También configuré un controlador ajax global que verifica la presencia de ese encabezado y responde apropiadamente cuando está presente (por ejemplo, redirigiendo toda la página a la pantalla de inicio de sesión).
En caso de que esté interesado, aquí está el código jQuery que debo vigilar para ese encabezado personalizado:
fuente
Encontré una función para verificar si su llamada ha sido redirigida. Es xhr.state (): si es "rechazado", entonces ocurrió una redirección.
Ejemplo con devolución de llamada exitosa:
Ejemplo con devolución de llamada de error:
fuente
No puedo agregar a la perspicaz sabiduría de los codificadores anteriores que han respondido, pero agregaré un caso específico que otros pueden encontrar útil para conocer.
Encontré este redireccionamiento silencioso 302 en el contexto de SharePoint. Tengo un código de cliente Javascript simple que hace ping a un subsitio de SharePoint, y si recibe una respuesta HTTP 200, se traslada a ese sitio, vía
window.location
. Si recibe algo más, le da al usuario un aviso de que el sitio no existe.Sin embargo, en el caso de que el sitio exista pero el usuario no tenga permiso, SharePoint redirige silenciosamente a una página AccessDenied.aspx. SharePoint ya realizó el protocolo de enlace de autenticación HTTP 401 a nivel de servidor / granja: el usuario tiene acceso a SharePoint. Pero el acceso al subsitio se maneja, supongo, usando indicadores de base de datos de algún tipo. El redireccionamiento silencioso pasa por alto mi cláusula "else", por lo que no puedo lanzar mi propio error. En mi caso, esto no es un obstáculo, es un comportamiento predecible consistente. Pero fue un poco sorprendente, ¡y aprendí algo sobre las solicitudes HTTP en el proceso!
fuente
Estaba interesado en lo mismo y no pude encontrar el
state()
método mencionado por Takman e investigué un poco por mí mismo. Por el bien de las personas que se presenten aquí en busca de una respuesta, aquí están mis hallazgos:Como se indicó varias veces, no puede evitar las redirecciones, pero puede detectarlas. De acuerdo con MDN , puede usar el
responseURL
deXMLHttpRequestObject
, que contendrá la URL final de la que proviene la respuesta, después de todas las redirecciones. La única advertencia es que no es compatible con Internet Explorer (Edge lo tiene). Dado que elxhr
/jqXHR
pasado a la funciónsuccess
/done
de jquery es una extensión del realXMLHttpRequest
, también debería estar disponible allí.fuente
Supongo que recibes una respuesta 200 porque la segunda vez no hay redirección, porque la página 404 no caduca, se guarda en la caché. Es decir que la segunda vez que el navegador te da la página en el caché. Hay una propiedad "caché" en el jquery ajax. http://api.jquery.com/jQuery.ajax/
Deberías escribirlo en "falso"
fuente
Si bien no es posible deshabilitar la redirección de ubicación siguiente en XmlHttpRequests , lo es cuando se usa fetch () :
fuente
No estoy seguro de si esto se aplicará en su caso, pero puede escribir código para responder a códigos de estado específicos en la función AJAX:
fuente
En los encabezados de solicitud en el caso de una solicitud ajax, tendrá lo siguiente
Según este criterio en el lado del servidor, puede filtrar las solicitudes.
fuente