2010-08-08 10 views
13

Le pedí una anterior question que fue definitivamente útil y me hizo saber acerca de JSONP. Sin embargo, veo que tengo que especificar JSONP como el tipo de datos. Ahora, hasta donde sé, ese es el tipo de devolución de los datos que regresan, que sería XML. ¿Se puede devolver XML utilizando JSONP o estoy limitado a que regrese como formato JSONP? ¡Gracias!Uso de JSONP al devolver XML

Respuesta

13

Está limitado a JSONP (y no a XML) por su funcionamiento. JSONP se convierte en esto:

<script src="myPage?callback=myFunction" type="text/javscript"> 

Así que cuando se toma el contenido, es efectivamente hacer esto:

<script type="text/javascript"> 
    myFunction({ data: value, data2: value2 }); 
</script> 

Lo que vuelve es real la ejecución de JavaScript, por lo que no puede ser XML, obtendrá todo tipo de errores de sintaxis, exactamente como lo haría hacer esto:

<script type="text/javascript"> 
    <elem> 
    <data>value</data> 
    <data2>value2</data2> 
    </elem> 
</script> 

como Puedo magine, el analizador de JavaScript no va a gustar mucho, y no sabe qué hacer con él. jQuery puede analizar XML en la mayoría de los casos sin ningún problema, pero si está utilizando JSONP y es para solicitudes entre dominios ... bueno, JSONP es su única opción allí, a menos que haya escrito una página de proxy en su sitio que no viole reglas de política de mismo origen, y lo usó como un proxy para obtener el XML a través de.

+0

Gracias por la ayuda! Si quisiera POSTAR los datos a la API _sin_ usar JSONP, podría simplemente ENVIAR los datos a la API y no tener que preocuparme de que el extraño dominio cruzado sea correcto. Gracias por la ayuda, soy php y Javascript/jQuery todavía es nuevo para mí. Básicamente, estoy tratando de escribir un widget para poner en otros sitios, por lo que estoy limitado a Javascript, y no puedo usar nada del lado del servidor. ¡Gracias de nuevo! – patricksweeney

+1

@patricksweeney - Podría publicar que sí, pero no obtendrá una respuesta, es la respuesta * del * servidor, no una POST * para * el servidor bloqueado por su navegador ... el contenido de la respuesta POST estar vacío, así es como funciona la seguridad del mismo origen en todos los principales navegadores. –

+1

Entonces, básicamente, debería ver si podemos ajustar la respuesta del servidor en JSONP o usar un proxy, ¿verdad? – patricksweeney

2

La idea es enviar código ejecutable desde el servidor. Escriba un complemento jQuery o amplíe la función ajax para devolver la cadena XML como un parámetro de función.

myCallback(" 
    <root> 
    <person> 
     <first>John</first> 
     <last>Doe</last> 
    </person> 
    </root>") 

El plugin analizará esta cadena a XML y volver de nuevo a su devolución de llamada real. En lo que respecta a la devolución de llamada, desconoce el proceso de conversión string -> xml.

Aquí hay un implementation existente.

La interfaz más ideal para esto con jQuery sería,

$.ajax({ 
    url: 'http://example.com/resource?type=xml', 
    dataType: 'xmlp', 
    success: function(xml) { .. } 
}); 

pero ya jugar un poco y volver a escribir jQuery.ajax es problemático, se podría escribir esto como un propio plugin espacio de nombres separado que se utilice getScript debajo.

$.myNamespace.ajax({ 
    .. 
}); 

Para que esto funcione, necesitará el control del servidor. El servidor debe saber que se solicita XML y responder con una llamada a la función que contiene la cadena XML como parámetro. Suponiendo que el nombre de devolución de llamada que envió al servidor remoto fue foo, el servidor tendrá que responder con algo como:

foo("<names><name>..</name></names>") 

Creo que si estuviera utilizando un navegador que admite E4X, entonces no habría necesidad de envuelve el XML dentro de una cadena. El servidor podría simplemente devolver el XML como argumento a la función de devolución de llamada:

foo(
    <names> 
    <name>John Doe</name> 
    </names> 
) 

Pero, por desgracia, E4X no está apoyado ampliamente todavía.

+3

jQuery es compatible con xmlp si establece 'dataType' en' jsonp xml'. Según los documentos: "A partir de jQuery 1.5, jQuery puede convertir un tipo de datos de lo que recibió en el encabezado Content-Type a lo que necesita. Por ejemplo, si desea que una respuesta de texto se trate como XML, use" text xml " para el tipo de datos. También puede hacer una solicitud JSONP, recibirla como texto e interpretarla jQuery como XML: "jsonp text xml". De manera similar, una cadena abreviada como "jsonp xml" primero intentará convertir de jsonp a xml y, en su defecto, convertir de jsonp a texto, y luego de texto a xml. " –

+0

@ greg.kindel - gracias por la información. Voy a ** intentar ** actualizar la respuesta, pero me siento un poco flojo en este momento. – Anurag

-3

Puede escribir XML en la función Javascript dentro de /* comment */ y convertir esta función en texto con el método functionname.toString() y análisis de texto entre "/*" y "*/" con función JSONP 's de devolución de llamada, que funciona en todos los navegadores antiguos. Ejemplo xml_via_jsonp.js:

function myfunc() 
{/* 
<xml> 
<div class="container"> 
     <div class="panel panel-info col-lg-10 col-lg-offset-1 added-panel"> 
      <div class="panel-heading">Random1 - Random2</div> 
      <div class="panel-body"> 
       <div>Random3</div> 
      </div> 
     </div> 
    </div> 
</xml> 
*/} 

function callback(func) 
{ 
var myhtml = func.toString(); 
var htmlstart = myhtml.indexOf('/*'); 
var htmlend = myhtml.lastIndexOf('*/'); 
return myhtml.substr(htmlstart+2, htmlend-htmlstart-2); 
} 
+2

Esa es una idea terrible. – cpburnz

+0

¿Y cuál es tu mejor idea? – Derozer

+0

Simplemente podría almacenar el XML en una cadena. Omitiendo por completo todo 'func.toString()' con 'xml_string' en su lugar. – cpburnz