2011-12-16 8 views
18

Alcuni servizi dati JSON su Internet sono progettati per essere consumati solo dai server e trascurano la possibilità di essere consumati direttamente da un'app solo per il Web.Come posso utilizzare JSON sulla pagina Web da un'origine senza né CORS né JSONP?

A causa di problemi tra siti, tali servizi potrebbero funzionare se hanno fornito un formato JSONP o il supporto CORS abilitato.

Voglio fare un piccolo strumento JavaScript che può chiamare una risorsa online che restituisce solo JSON e non, e non supporta.

Un caso di esempio era un'app a pagina singola che stavo facendo per la quale l'unica fonte di dati che ho trovato non forniva CORS o JSONP. Essendo un'app a pagina singola, non disponeva di alcun server, pertanto era soggetta alla stessa politica di origine.

Quali strategie sono disponibili in questi casi?

risposta

35

** Un modo è quello di trovare un proxy che può accedere a una fonte di dati JSON e poi servire al vostro web app trasformata per lavorare con JSON, CORS, o qualsiasi altro formato che è possibile gestire senza preoccuparsi di cross-site preoccupazioni.

Uno di questi proxy è Yahoo's "YQL".

YQL supporta sia JSONP che CORS.

Quindi, se il browser supporta anche CORS, è possibile considerarlo come un server proxy JSON-JSON gratuito. Se no, allora è anche un JSON libero di JSONP delega:

Ecco un esempio di come l'ho usato 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

Come funzionerebbe? Stai violando la politica della stessa origine e la chiamata fallirebbe. Non avresti bisogno di fare una sorta di chiamata JSONP a YQL? –

+1

Niente affatto perché YQL supporta ['CORS'] (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing), che è un'alternativa molto migliore a JSONP poiché utilizza la stessa interfaccia XHR anziché lo script- metodo di iniezione che presenta alcuni inconvenienti. Anche YQL supporta JSONP se ne hai bisogno. Aggiornerò la mia risposta – hippietrail

+0

Se vuoi davvero che JSONP passi un parametro 'callback' così come' format: 'json''. – hippietrail

Problemi correlati