2010-12-07 19 views
5

No tengo problemas para hacer solicitudes jsonp, sin embargo, no estoy seguro acerca de la configuración de un servicio web para entregar respuestas en jsonp.Prueba de una respuesta jsonp estática

En primer lugar, ¿es necesario configurar un servidor de cierta manera para permitir solicitudes jsonp, o la página solo debe tener la respuesta formateada correctamente?

En mis pruebas tengo la siguiente respuesta jsonp de geonames.org (He colocado una página en blanco en el servidor/dominio 1 con nada más):

<?php echo $_GET['callback'];?>({"postalcodes":[{"adminName2":"Westchester","adminCode2":"119","postalcode":"10504","adminCode1":"NY","countryCode":"US","lng":-73.700942,"placeName":"Armonk","lat":41.136002,"adminName1":"New York"}]}); 

El servidor/dominio 2 I' m hacer la petición siguiente:

$.ajax({ 
    // works when I make the call to geonames.org instead of domain1 
    //url: 'http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?',, 
    url: 'http://www.domain1.com/test/jsonp.php?callback=?', 
    success: function(data) { 
     $('#test').html(data); 
    }, 
}); 

la llamada funciona cuando coloco los archivos en el mismo servidor (ya sea de dominio 1 o 2) y convertirla en una solicitud JSON regular. ¿Qué estoy haciendo mal?

Solo para aclarar: Mi pregunta se refiere a la página RECEPCIÓN de la solicitud. Sé que la solicitud funciona cuando llego a geonames.org, flickr, etc ... apis. Sin embargo, estoy tratando de configurar una página para enviar una respuesta. En mi ejemplo, tengo una página en blanco con jsonp codificado. No estoy seguro si tengo que tener otros encabezados en la página o si tengo algo habilitado en mi servidor.

+0

es la persona que llama y el servidor existe en el mismo dominio ??? – kobe

+0

@gov, no, no lo hacen. Mi ejemplo es usar tres servidores diferentes (y dominios). El dominio 1 que solicita datos de geonames.org funciona. Tomar la respuesta de geonames.org y colocarla en una página en blanco en el dominio 2 y hacer la misma solicitud desde el dominio 1 al dominio 2 no funciona. Lo mismo para revertirlo y realizar la solicitud del dominio 2 al dominio 1. – Choy

+0

Tuve que agregar un encabezado de control de acceso para que funcione: header ('Access-Control-Allow-Origin: *'); (en PHP) – Choy

Respuesta

12

La respuesta es incorrecta.

Si usted tiene la siguiente url: http://www.mydomain.com/test/jsonp.php & callback =? jQuery reemplazará el signo de interrogación al final de la url con una cadena única. Por serverside usted tiene que tomar esta cadena ($ _GET [ 'callback']) y utilizarlo como nombre-función de su respuesta:

PHP-ejemplo:

<?php 
$object=array('postalcodes' 
        =>array(
          array(
            "adminName2" => "Westchester", 
            "adminCode2" => "119", 
            "postalcode" => "10504", 
            "adminCode1" => "NY", 
            "countryCode" => "US", 
            "lng"   => -73.700942, 
            "placeName" => "Armonk", 
            "lat"   => 41.136002, 
            "adminName1" => "New York" 
            ))); 

    echo $_GET['callback'].'('.json_encode($object).')'; 
?> 

lo que sucede con el respuesta al recibirlo? jQuery conoce la cadena única (suponiendo fx123456).
jQuery creará un <script> -elemento con el src: http://www.mydomain.com/test/jsonp.php & callback = fx123456. jQuery llamará a una función creada sobre la marcha llamada fx123456(). Esta función devolverá el JSON (como un objeto) que se tomará como argumento de datos de la función de éxito de $ .ajax().

Así que si no utiliza el parámetro de devolución de llamada proporcionado por jQuery como nombre-funciones dentro de la respuesta, jQuery no conoce el nombre de la función a llamar (mejor decir que jQuery llamará a una función que no funciona existe).

+0

gracias, eso aclara mucho las cosas! Intenté su respuesta de muestra, además de simplemente usar $ _GET ['callback'] y escribir el jsonp como texto sin formato, pero ambos responden con una página en blanco cuando intento acceder usando la llamada $ .ajax. Se envía correctamente al acceder a la página directamente desde el navegador y también cambia la devolución de llamada a lo que yo configuré en la URL del navegador. Cambiar la URL del servidor a la API de geoname funciona bien, por lo que la llamada del lado del cliente está bien. ¿Podría haber alguna configuración de alojamiento/servidor que deba cambiar? – Choy

+0

Tendrá que establecer la opción dataType de '$ .ajax()' a 'jsonp'. O use $ .getJSON() en su lugar. –

+0

He intentado ambas cosas y todavía recibo una respuesta jsonp vacía. – Choy

0

Siempre he usado $.getJSON() en lugar $ .ajax para solicitudes de varios navegadores, así que no conozco los detalles sobre cómo llamar a json utilizando $ .ajax como lo has hecho aquí, pero ¿has intentado configurar el tipo de datos en jsonp?

Además, ¿has probado? Callback =? en lugar de & callback =?

$.ajax({ 
    url: 'http://www.mydomain.com/test/jsonp.php?callback=?', 
    dataType: 'jsonp', 
    success: function(data) { 
     $('#test').html(data); 
    }, 
}); 

Por último, cuando corro el JSON de prueba en jsonlint.com no está regresando válida. Dice syntax error, unexpected TINVALID at line 1 Parsing failed

+0

He intentado usar $ .get en su lugar y estableciendo el tipo de datos en jsonp sin suerte. Está volviendo inválido porque json está envuelto en?(); para la devolución de llamada jsonp. Pero funciona (fue tomado de la API de geonames.org). – Choy

+0

En caso de que alguien todavía esté mirando esto como guía, no agregue la devolución de llamada a la cadena de consulta, jquery lo hará por usted si especifica jsonp. – ldg