2010-10-06 9 views
13

Próbowałem trochę treści z Wikipedii jako JSON:Brak reakcji MediaWiki API za pomocą jQuery

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

Ale mam nic w odpowiedzi. Gdybym wklej do paska adresu przeglądarki, coś

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

uzyskać oczekiwaną zawartość. Co jest nie tak?

Odpowiedz

31

Trzeba wyzwolić zachowanie jsonp z $.getJSON() dodając &callback=? na kwerendy, tak:

$.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.

Bez użycia JSONP uderza się w same-origin policy, który blokuje XmlHttpRequest przed odzyskaniem jakichkolwiek danych.

+3

Dziękuję bardzo za zrobienie tak prostego skrzypce. Wkurzyłem od wielu godzin, a twoja prosta rzecz sprawiła, że ​​kliknąłem. Dziękuję Ci. – MoshMage

+0

Testowałem to przez wiele godzin zastanawiając się, dlaczego to nie działa, mimo że http://jsonlint.com/ powiedział, że jest to ważna prośba. Dzięki! –

+0

To już nie działa. To jedyny sposób, w jaki znalazłem wyszukiwanie w Wikipedii: https://jsfiddle.net/tqeL3od2 – vault

0

Musisz użyć , jeśli otrzymujesz dane z innej domeny, jest to część "same origin policy".

EDIT

Właściwie co powiedział Nick, slap &callback=? na końcu łańcucha zapytania powołać getJSONP.

+1

istnieje żaden '$ .getJSONP()' :) –

+0

Tak, właśnie to wymyśliłem, edytowałem :-) dzięki –

3

Jak wskazują inne odpowiedzi, wysyłasz zapytanie między domenami.

Jedna odpowiedź, która działa teraz, a które mają zarówno biorąc pod uwagę jest użycie JSONP zamiast JSON, ale istnieje inna odpowiedź nazywa CORSCross-origin resource sharing.

Pomimo tego, że CORS jest obsługiwany przez MediaWiki, nie jest on jeszcze włączony w Wikipedii ze względu na subtelności między tym mechanizmem a buforowaniem Wikipedii.

Istnieje otwarty raport o błędzie, aby to działało w Wikipedii: Enable $wgCrossSiteAJAXdomains for wikimedia sites.

Po jego rozwiązaniu będziesz mógł wysyłać żądania AJAX z różnych domen do Wikipedii bez potrzeby korzystania z JSONP z przeglądarek obsługujących CORS. Najnowsze wersje wszystkich głównych przeglądarek obsługują teraz CORS. W przypadku Internet Explorera oznacza to wersję 10, na którą niewiele osób pracuje. Wersja 9 ma alternatywne rozwiązanie o nazwie , które nie zyskało zbyt dużej popularności.

0

Jedną z opcji, aby wykonać CORS żądanie zamiast jsonp jest jawnie zawierać parametr origin=* w adresie URL żądania, na przykład:

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>