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