2015-08-31 10 views
8

Ciao Sto cercando di utilizzare SOLO JavaScript e HTML per leggere l'oggetto json da un URL. Sto usando il seguente codice:Javascript JSON intersusone

function getJSONP(url, success) { 

    var ud = '_' + +new Date, 
     script = document.createElement('script'), 
     head = document.getElementsByTagName('head')[0] 
      || document.documentElement; 

    window[ud] = function(data) { 
     head.removeChild(script); 
     success && success(data); 
    }; 

    script.src = url.replace('callback=?', 'callback=' + ud); 
    head.appendChild(script); 
} 

getJSONP('http://webURl?&callback=?', function(data){ 
    console.log(data); 
}); 

Come ci avete indovinato sto ottenendo Not at same origin as the document, and parent of track element does not have a 'crossorigin' attribute. Origin 'null' is therefore not allowed access.

FYI il server restituisce dati JSON e doesnot hanno funzione di callback.

Applausi per il vostro aiuto.

+1

Se il server non supporta JSONP e non supporta CORS di quanto tu non sia fortunato. JavaScript non può aggirare lo stesso criterio di origine. È lì per una ragione. – epascarello

+0

@epascarello quindi pensi che se il server supporta JSONP allora questo codice funzionerà correttamente. – usrNotFound

+0

Dovrebbe funzionare per JSONP – epascarello

risposta

7

Il server sia bisogno di avere CORS abilitato utilizzando le intestazioni in questo modo: (Crediti per la risposta qui: CORS with php headers)

// Allow from any origin 
if (isset($_SERVER['HTTP_ORIGIN'])) { 
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
    header('Access-Control-Allow-Credentials: true'); 
    header('Access-Control-Max-Age: 86400'); // cache for 1 day 
} 

// Access-Control headers are received during OPTIONS requests 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS");   

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
     header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

    exit(0); 
} 

o il server ha la necessità di uscita JSONP come:

echo $_GET['callback'] . '(' . json_encode($whatever) . ')'; 

Un'altra opzione se questo non è sul tuo server è creare un file PHP sul tuo server che fa un filegetcontents sull'URL che devi leggere (con i dati JSON senza cors) ed echo gli stessi dati nel formato JSONP. Puoi quindi utilizzare questo nuovo file PHP (url) nella tua pura funzione javascript getJSON.

Senza un server nel mezzo o cors o jsonp, non è possibile.

+0

Non rubare altre risposte! http://stackoverflow.com/questions/8719276/cors-with-php-headers – GuyT

+0

Le mie scuse, avrei dovuto aggiungere il link. Modificato la mia risposta per includere il link. Grazie per averlo notato. –

4

Se si desidera una rapida correzione operativa &, è possibile recuperare il contenuto tramite un iframe o utilizzare un proxy come YQL.

Ma vorrei raccomandare l'utilizzo di una strategia di back-end per recuperare il contenuto, quindi elaborarlo con javascript.