2009-11-26 11 views
7

Estoy haciendo un $ .get para llamar a un servicio 'A'. El servicio 'A' devuelve texto sin formato que se muestra en la página. Pero a veces redirige al servicio 'B' que devuelve texto sin formato. Pero no puedo manejar el texto de respuesta del servicio 'B'. ¿Cómo puedo hacer eso?manejar jquery ajax redirigir

Respuesta

0

Si el servicio B está escuchando en un dominio diferente, entonces tales llamadas AJAX de dominio cruzado están prohibidas, a menos que exista un archivo crossdomain.xml que lo permita.

+0

estoy usando jsonp para realizar llamadas de dominio cruzado (de hecho, 'A' y 'B' devuelven el texto json). .. y 'A' también está en un dominio diferente. – akula1001

+0

Hmm.¿Has intentado rastrear las solicitudes desde el navegador? – PanJanek

5

no puedo probarlo, pero espero que esta secuencia de comandos que puede guiar a una solución:

que tendría que demostrar sus diferencias de estatus o texto en cada tipo de respuesta por parte de "a.php"

$.ajax({ 
    type: "GET", 
    url: "a.php", 
    complete: function (XMLHttpRequest, textStatus) { 
    if (XMLHttpRequest.status!=200) // or responseText 
    { 
     var fn = arguments.callee; 
     var _this = this; 
     setTimeout(function(){fn.call(_this, XMLHttpRequest, textStatus);}, 200); 
    } 
    else 
    { 
     //ok 
    } 
    } 
}); 

o editar:

complete: function xCompleteFunction(XMLHttpRequest, textStatus) { 
    if (XMLHttpRequest.status!=200) // or responseText 
    { 
     var _this = this; 
     setTimeout(function(){xCompleteFunction.call(_this, XMLHttpRequest, textStatus);}, 200); 
    } 
    else 
    { 
     //ok 
    } 
    } 

function call to itself

EDITAR II:

redirect.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<title></title> 
<script type="text/javascript"> 
$(function(){ 
    $("#senddata").click(function(){ 
     $.ajax({ 
      type: "GET", 
      url: "a.php", 
      complete: function xCompleteFunction(XMLHttpRequest, textStatus) { 
       $("#info").append(""+XMLHttpRequest.status+"<br />"+XMLHttpRequest.responseText+"<br>"); 
       if (XMLHttpRequest.status==301) // or responseText 
       { 
        var _this = this; 
        setTimeout(function(){xCompleteFunction.call(_this, XMLHttpRequest, textStatus);}, 200); 
        $("#info").append("waiting redirect<br>"); 
       } 
       else 
       { 
        $("#info").append("redirect ok<br>"); 
       } 
      } 
     }); 
    }); 
}); 
</script> 
</head> 
<body> 
<button id="senddata">send ajax request</button> 
<pre id="info"></pre> 
</body> 
</html> 

a.php:

<?php 
for($a=0;$a<1000000;$a++) 
{ 
    //wait 
} 
header('Location: b.php'); 

b.php:

<?php 
    print "hola mundo"; 

Importante:Status Code Definitions

+0

intenté copiar esto y usar pero no pareció funcionar. No puedo entender mucho. ¿podría explicar este código? soy completamente nuevo en javascript. – akula1001

0

¿Cuál es la naturaleza del servicio 'A' y 'B'? Una solución más ordenada sería manejar la discrepancia en el lado del servidor. Por ejemplo, si un servicio es un script PHP ...

<?php 

if(prerequisite for display service A plain text){ 

    echo "service a plain text"; 

}else{ 

    echo "service b plaint text"; 

} 

?> 

Alternativamente, si estos servicios son archivos de texto, usted podría tener un tercer archivo que toma la decisión, e incluye servicio A o B dependiendo. Por ejemplo, esto podría ser ajax.php, y se llamaría ajax.php en todos los casos:

<?php 

if(prerequisite for displaying service A plain text){ 

    echo file_get_contents("a.txt"); 

}else{ 

    echo file_get_contents("b.txt"); 

} 

?> 

De lo que suena, el condicional habrá file_exists("a.txt"), pero eso es sólo una conjetura de mi parte.

¡Buena suerte y comente si tiene alguna pregunta!

+0

no, así no es como funciona. la aplicación está integrada con CAS, por lo que una solicitud de 'A' provoca una redirección a CAS que se autentica y luego hace otra redirección a 'A'. puedo ver los redireccionamientos usando firebug pero no en el controlador en jquery. – akula1001

2

Usted no puede hacer esto en javascript. Puede cambiar su comportamiento del lado del servidor.

La redirección silenciosa (transparente) es la parte de la especificación XMLHttpRequest (consulte here especialmente las palabras "... sigue de forma transparente la redirección ..."). La mención estándar solo menciona que el agente de usuario (el navegador web) puede evitar o notificar ciertos tipos de redirecciones automáticas, pero no es parte de XMLHttpRequest. Es la parte de la configuración del cliente HTTP (configuración del sistema operativo) o la configuración del navegador web