2011-12-16 8 views
18

Algunos servicios de datos JSON en Internet están diseñados para ser consumidos solo por servidores y descuidan la posibilidad de ser consumidos directamente por una aplicación web.¿Cómo puedo usar JSON en la página web desde una fuente sin CORS ni JSONP?

Debido a las preocupaciones entre sitios, dichos servicios funcionarían si proporcionaran un formato JSONP o habilitaran el soporte CORS.

Quiero hacer una pequeña herramienta de JavaScript que puede llamar a un recurso en línea que solo devuelve JSON y no, y no es compatible.

Un ejemplo de caso fue una aplicación de una sola página que estaba haciendo para la cual la única fuente de datos que pude encontrar no proporcionó CORS o JSONP. Siendo una aplicación de una sola página, no tenía un servidor propio, por lo que estaba sujeta a la misma política de origen.

¿Qué estrategias hay disponibles en estos casos?

Respuesta

35

** Una forma es encontrar un proxy que se puede acceder a una fuente de datos JSON y luego servir a su aplicación web transformado para trabajar con JSON, CORS, o cualquier otro formato que puede manejar sin preocuparse de cross-site preocupaciones

Uno de estos poderes es Yahoo's "YQL".

YQL es compatible con JSONP y CORS.

Así que si su navegador también es compatible con CORS, puede pensar que es un servidor proxy JSON a JSON. Si no es así, entonces también es un JSON libre de JSONP de proxy:

Aquí está un ejemplo de cómo lo utilicé con jQuery:

$.getJSON("http://query.yahooapis.com/v1/public/yql", 
    { 
    q:  "select * from json where url=\"http://airportcode.riobard.com/airport/" + code + "?fmt=JSON\"", 
    callback: gotJSON, // you don't even need this line if your browser supports CORS 
    format: "json" 
    }, 
    function(data){ 
    if (data.query.results) { 
     /* do something with 
     data.query.results.json.code 
     data.query.results.json.name 
     data.query.results.json.location 
     */ 
    } else { 
     /* no info for this code */ 
    } 
    } 
); 

And a version on jsfiddle...

+0

Cómo funcionaría eso? Usted está violando la política de origen idéntico y la llamada fallaría. ¿No necesitarías hacer algún tipo de llamada JSONP a YQL? –

+1

No, en absoluto porque YQL es compatible con ['CORS'] (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing), que es una alternativa mucho mejor que JSONP ya que utiliza la misma interfaz XHR que el script- método de inyección que tiene algunos inconvenientes. YQL también admite JSONP si lo necesita. Actualizaré mi respuesta. – hippietrail

+0

Si realmente quieres JSONP, puedes pasar un parámetro 'callback' y' format: 'json''. – hippietrail

Cuestiones relacionadas