Подтвердить что ты не робот

Нет ответа от 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

Я получаю ожидаемый контент. Что не так?

4b9b3361

Ответ 1

Вам нужно вызвать поведение 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 от получения любых данных.

Ответ 2

Как указывают другие ответы, вы делаете запрос на междоменное соединение.

Один ответ, который работает сейчас и который оба они заданы, заключается в использовании JSONP вместо JSON, но есть еще один ответ, называемый CORS Совместное использование ресурсов ресурса.

Однако, хотя CORS поддерживается MediaWiki, он еще не включен в Википедии из-за тонкостей между ними и того, как работает кеширование Википедии.

В Википедии есть открытый отчет об ошибке: Включить $wgCrossSiteAJAXdomains для викимедийных сайтов.

Как только это будет разрешено, вы сможете сделать междоменные запросы AJAX в Википедию без необходимости использования JSONP из браузеров, которые поддерживают CORS. Последние версии всех основных браузеров теперь поддерживают CORS. Для Internet Explorer это означает версию 10, в которой работает не так много людей. Версия 9 имеет альтернативное решение под названием , которые не пользовались большой популярностью.

Ответ 3

Вам нужно будет использовать getJSONP, если вы получаете данные из другого домена, это часть " та же самая политика происхождения".

ИЗМЕНИТЬ

Собственно, что сказал Ник, нажмите &callback=? в конце строки запроса, чтобы вызвать getJSONP.

Ответ 4

Один из вариантов выполнения запроса 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>