Brak odpowiedzi ze strony MediaWiki API przy użyciu jQuery

Próbowałem zdobyć trochę treści z Wikipedii jako JSON:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json", function(data) {
    doSomethingWith(data);
});
Ale nie mam nic w odpowiedzi. Jeśli wkleję do paska adresu przeglądarki, coś w stylu
http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=jQuery&format=json

Otrzymuję oczekiwaną treść. Co się stało?

Author: Damjan Pavlica, 2010-10-06

4 answers

Musisz wyzwalać zachowanie JSONP z $.getJSON() dodając &callback=? w zapytaniu, tak:

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

Możesz go przetestować tutaj .

Bez użycia JSONP uderzasz w politykę samego pochodzenia, która blokuje XmlHttpRequest przed odzyskaniem jakichkolwiek danych.

 30
Author: Nick Craver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 14:39:05

Jak wskazują inne odpowiedzi, składasz żądanie między domenami.

Jedyną odpowiedzią, która działa teraz i którą oboje Dali, jest użycie JSONP zamiast JSON, ale jest inna odpowiedź o nazwie CORS Cross-origin resource sharing .

Pomimo tego, że CORS jest wspierany przez MediaWiki, nie jest jeszcze włączony w Wikipedii ze względu na subtelności między tym, jak działa buforowanie Wikipedii.

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

Gdy to zostanie rozwiązane, będziesz mógł wysyłać między domenami żądania AJAX do wikipedii bez potrzeby JSONP z przeglądarek obsługujących CORS. Najnowsze wersje wszystkich głównych przeglądarek obsługują teraz CORS. Dla Internet Explorera oznacza to wersję 10, która nie jest uruchomiona przez wiele osób. Wersja 9 ma alternatywne rozwiązanie o nazwie xdomainrequest , które nie zyskało dużej popularności.

 3
Author: hippietrail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-03 02:48:16

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

EDIT

Właściwie to, co powiedział Nick, naciśnij &callback=? na końcu łańcucha zapytania, aby wywołać getJSONP.

 0
Author: Ben Everard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-06 14:39:03

Jedną z opcji wykonania żądania CORS zamiast JSONP jest jawne włączenie parametru 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>
 0
Author: Vadim Gremyachev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-09 15:02:26