2010-10-06 8 views
13

ho cercato di ottenere alcuni contenuti da Wikipedia come JSON:Nessuna risposta da MediaWiki API utilizzando jQuery

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json", function(data) { 
    doSomethingWith(data); 
}); 

Ma non ha niente in risposta. Se si incolla nella barra degli indirizzi del browser, qualcosa come

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=jQuery&format=json 

Ottengo il contenuto previsto. Cosa c'è che non va?

risposta

31

È necessario innescare comportamenti JSONP con $.getJSON() aggiungendo &callback=? in querystring, in questo modo:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?", function(data) { 
    doSomethingWith(data); 
}); 

You can test it here.

Senza utilizzare JSONP si sta colpendo lo same-origin policy che blocca XmlHttpRequest dall'ottenere indietro qualsiasi dato.

+3

Grazie mille per aver fatto un semplice violino. Ho martellato per ore e la tua semplice cosa mi ha fatto fare clic. Grazie. – MoshMage

+0

Lo stavo testando per ore chiedendomi perché non funzionava anche se http://jsonlint.com/ diceva che era una richiesta valida. Grazie! –

+0

Questo non funziona più. Questo è l'unico modo che ho trovato per cercare su Wikipedia: https://jsfiddle.net/tqeL3od2 – vault

0

È necessario utilizzare getJSONP se si ricevono dati da un altro dominio, fa parte del "same origin policy".

EDIT

In realtà quello che ha detto Nick, schiaffo &callback=? sulla fine della stringa di query per richiamare getJSONP.

+1

Non c'è '$ .getJSONP()' :) –

+0

Sì, l'ho appena pensato, editato :-) grazie –

3

Come le altre risposte indicano, si sta effettuando una richiesta tra domini.

L'unica risposta che ora funziona e che hanno entrambi dato è quello di utilizzare al posto di JSONPJSON, ma c'è un'altra risposta chiamato CORSCross-origin resource sharing.

Tuttavia, anche se CORS è supportato da MediaWiki, non è ancora abilitato su Wikipedia a causa di sottigliezze tra esso e come funziona la memorizzazione nella cache di Wikipedia.

C'è una segnalazione di bug aperta per farlo funzionare su Wikipedia: Enable $wgCrossSiteAJAXdomains for wikimedia sites.

Una volta risolto questo problema, sarà possibile effettuare richieste AJAX su più domini su Wikipedia senza bisogno di JSONP dai browser che supportano CORS. Le ultime versioni di tutti i principali browser ora supportano CORS. Per Internet Explorer significa la versione 10 che non sono in esecuzione molte persone. La versione 9 ha una soluzione alternativa chiamata che non ha guadagnato molta popolarità.

0

Una possibilità di effettuare richiesta CORS invece di JSONP è quello di includere esplicitamente parametro origin=* nella richiesta URL, ad esempio:

var title = "jQuery"; 
 

 
$.getJSON("https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&origin=*", function(data) { 
 
    console.log(data.query.pages); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>