2010-10-06 5 views
13

J'ai essayé d'obtenir un contenu de Wikipédia comme JSON:Aucune réponse de l'API MediaWiki en utilisant jQuery

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

Mais je n'a rien en réponse. Si je colle à la barre d'adresse du navigateur, quelque chose comme

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

Je reçois le contenu attendu. Qu'est-ce qui ne va pas?

Répondre

31

Vous devez déclencher un comportement JSONP avec $.getJSON() en ajoutant &callback=? sur la chaîne de requête, comme ceci:

$.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. Sans utiliser JSONP vous frappez le same-origin policy qui bloque le XmlHttpRequest d'obtenir n'importe quelles données en arrière.

+3

Merci beaucoup d'avoir fait un si simple fiddle. J'ai martelé pendant des heures et votre truc simple m'a fait cliquer. Je vous remercie. – MoshMage

+0

Je testais cela pendant des heures en me demandant pourquoi cela ne fonctionnait pas même si http://jsonlint.com/ disait que c'était une demande valide. Merci! –

+0

Cela ne marche plus. C'est la seule façon que j'ai trouvé pour rechercher Wikipedia: https://jsfiddle.net/tqeL3od2 – vault

0

Vous aurez besoin d'utiliser getJSONP si vous recevez des données d'un autre domaine, cela fait partie du "same origin policy".

EDIT

En fait, ce que dit Nick, claque &callback=? sur la fin de votre chaîne de requête pour appeler getJSONP.

+1

Il n'y a pas '.getJSONP $()' :) –

+0

Ouais je pensais juste que, édité :-) merci –

3

Comme le soulignent les autres réponses, vous effectuez une requête interdomaine.

La seule réponse qui fonctionne maintenant et qu'ils ont tous deux donné est d'utiliser JSONP au lieu de JSON, mais il y a une autre réponse appelée CORSCross-origin resource sharing.

Cependant, même si CORS est supporté par MediaWiki, il n'est pas encore activé sur Wikipédia en raison de subtilités entre celui-ci et le fonctionnement de la mise en cache de Wikipédia.

Il existe un rapport de bogue ouvert pour que cela fonctionne dans Wikipedia: Enable $wgCrossSiteAJAXdomains for wikimedia sites. Une fois cela résolu, vous serez en mesure de faire des requêtes AJAX interdomaines vers Wikipedia sans avoir besoin de JSONP de la part des navigateurs qui supportent CORS. Les dernières versions de tous les principaux navigateurs prennent désormais en charge CORS. Pour Internet Explorer, cela signifie que la version 10 n'est pas utilisée par beaucoup de gens. Version 9 a une solution alternative appelée qui n'a pas gagné beaucoup de popularité.

0

Une option pour effectuer la demande au lieu de CORS JSONP est d'inclure explicitement paramètre origin=* dans l'URL de la demande, par exemple:

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>

Questions connexes