Нет ответа от MediaWiki API, использующего jQuery - PullRequest
13 голосов
/ 06 октября 2010

Я пытался получить некоторый контент из Википедии в формате 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 ]

30 голосов
/ 06 октября 2010

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

3 голосов
/ 12 марта 2012

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

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

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

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

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

0 голосов
/ 09 декабря 2017

Одним из вариантов выполнения запроса 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>
0 голосов
/ 06 октября 2010

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

EDIT

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

...