Нет ответа от MediaWiki API, использующего jQuery
Я пытался получить некоторый контент из Википедии как JSON:
$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json", function(data) {
doSomethingWith(data);
});
Но я ничего не получил в ответ. Если я вставлю в адресную строку браузера, что-то вроде
http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=jQuery&format=json
Я получаю ожидаемый контент. В чем дело?
4 ответа
Вам нужно запустить JSONP с помощью $.getJSON()
добавляя&callback=?
в строке запроса, вот так:
$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?", function(data) {
doSomethingWith(data);
});
Вы можете проверить это здесь.
Без использования JSONP вы применяете политику того же источника, которая блокирует запрос XmlHttpRequest на получение каких-либо данных.
Как указывают другие ответы, вы делаете междоменный запрос.
Единственный ответ, который работает сейчас и который они оба дали, это использовать JSONP
вместо JSON
, но есть другой ответ под названием CORS
Совместное использование ресурсов.
Однако, несмотря на то, что CORS поддерживается MediaWiki, он еще не включен в Википедии из-за тонкостей между ним и тем, как работает кэширование в Википедии.
Есть открытый отчет об ошибке, чтобы заставить это работать в Википедии: Включите $wgCrossSiteAJAXdomains для сайтов Викимедиа.
Как только это будет решено, вы сможете отправлять междоменные запросы AJAX в Википедию без использования JSONP из браузеров, которые поддерживают CORS. Последние версии всех основных браузеров теперь поддерживают CORS. Для Internet Explorer это означает версию 10, на которой работает не так много людей. Версия 9 имеет альтернативное решение под названием /questions/tagged/xdomainrequest, которое не получило особой популярности.
Одним из вариантов выполнения запроса CORS вместо JSONP является явное включение параметра origin=*
в URL запроса, например:
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>
Вам нужно будет использовать getJSONP
если вы получаете данные из другого домена, это часть "той же политики происхождения ".
РЕДАКТИРОВАТЬ
На самом деле, что сказал Ник, пощечина &callback=?
в конце строки запроса для вызова getJSONP
,