2011-05-26 11 views
13

Estoy siguiendo el patrón PRG (Post-Redirect-Get) en mi aplicación web, y uso algo como lo siguiente para hacer la mayoría de mis POST:Obteniendo la URL real después de una POST que redirigió usando jquery .ajax()

$.ajax({ 
    type: 'POST', 
    url: 'A.html', 
    data: '....', 
    statusCode: { 
     302: function() { 
      alert("302"); // this is never called 
     }, 
     200: function() { 
      alert("200"); 
     }, 
    }, 
    success: function (data, textstatus) { 
     alert('You are now at URL: ' + ??); 
    }, 
    error: function (data) { 
    }, 
    complete: function (jqXHR, textstatus) { 
     alert('You are now at URL: ' + ??); 
    }, 
}); 

Necesito obtener la URL DESPUÉS de que se haya producido cualquier redirección, es decir, la URL del GET final que llamó la función .ajax(). Por ejemplo, una POST a A.html puede redirigirse a B.html o C.html (siempre a través de 302's). ¿Cómo obtengo la URL final?

Estoy usando jquery 1.5.1, y usando un proxy he visto que jquery sigue silenciosamente los redireccionamientos, lo cual me alegra. No me importan las URL que respondieron con 302. Me gustaría saber la URL de la solicitud final en el momento en que se activan los enlaces "success" o "complete" de .ajax().

+0

enviar esa URL con los datos y recuperar en la parte de 'éxito' de ajax – diEcho

+0

Puede elaborar con el ejemplo y especifique si los redireccionamientos anidados están sucediendo. Elaborarlo con el ejemplo-- Por ejemplo, un POST a A.html puede redirigirse a B.html o C.html (siempre a través de 302). ¿Cómo obtengo la URL final? –

+0

He confirmado el uso de un proxy que la POST a A.html responde con un "302 Encontrado" y Ubicación: B.html. Sin embargo, la clave del problema es que no puedo consultar javascript/jquery para obtener pruebas de que fui redireccionado a B.html en cualquier lugar. Si pido $ (this) .url, obtengo "A.html", lo mismo para window.location, etc. –

Respuesta

10

finalmente resuelto este problema mediante la adición de una cabecera adicional en todas mis respuestas (por ejemplo, "X-MYAPP-PATH:/Admin/Index").

Mi javascript por lo tanto podría ser cambiado a lo siguiente:

success: function (data, textstatus, xhrreq) { 
    alert('You are now at URL: ' + xhrreq.getResponseHeader("X-MYAPP-PATH")); 
}, 

todavía creen sin embargo que jQuery debe ser capaz de darme la URL actual, así que considere esto un truco.

-1

Primero intente descubrir el código de estado que devuelve la redirección (generalmente es> 300).

success: function (data, textstatus, xhrReq) { 
     //if the status is greater than 300 
     if(xhrReq.status > 300) { 
      alert('You are now at URL: ' + xhrRequest.getHeader("Location")); 
     } 
    }, 

un punto más para señalar que el orden de ejecución: éxito \ Falla -> función statusCode -> Completo

+2

No - jquery oculta cualquier evidencia del 302. xhrreq.status es 200 y xhr.getHeader() no está disponible función. –

+0

@Tom, getHeader funciona bien, pero necesito verificar 302 (tal vez tenga razón –

+1

Puede hacer 'xhrReq. GetAllResponseHeaders()', pero si 'Location' no está allí no tiene suerte. Y @TomWells es correcto, en cualquier caso no obtendrá la respuesta 302. Los redireccionamientos están ocultos por el navegador. – charlax

0

Una mejor solución es suministrar ajax de jQuery con un objeto xhr encargo de esta manera:

var xhr = new XMLHttpRequest(); 

$.ajax({ 
    url: '/url', 
    type: 'post', 
    data: '...', 
    xhr: function() { 
     return xhr; 
    } 
}); 

A continuación, puede acceder a la URL actual en cualquiera de devolución de llamada

success: function() { 
    alert('You are now at URL: ' + xhr.responseURL); 
}