2010-10-06 2 views
13

Я пытался получить содержимое из Википедии в формате JSON:Нет ответа от MediaWiki API с помощью JQuery

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

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

ответ

31

Вы должны вызвать поведение 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); 
}); 

You can test it here.

Без использования JSONP вы попадаете в same-origin policy, который блокирует XmlHttpRequest от получения любых данных.

+3

Большое вам спасибо за создание такой простой скрипки. Я стучала часами, и ваша простая вещь заставила меня щелкнуть. Спасибо. – MoshMage

+0

Я тестировал это часами, задаваясь вопросом, почему это не сработало, хотя http://jsonlint.com/ сказал, что его действительный запрос. Благодаря! –

+0

Это не работает. Это единственный способ найти Wikipedia: https://jsfiddle.net/tqeL3od2 – vault

0

Вам нужно будет использовать getJSONP, если вы получаете данные из другого домена, это часть «same origin policy».

EDIT

На самом деле то, что сказал Ник, пощечина &callback=? на конце вашей строки запроса для вызова getJSONP.

+1

Там нет '$ .getJSONP()' :) –

+0

Да, я просто подумал, что, отредактировал :-) спасибо –

3

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

Тот ответ, который работает в настоящее время и которые они оба дали, чтобы использовать JSONP вместо JSON, но есть еще один ответ называется CORSCross-origin resource sharing.

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

Существует открытый отчет об ошибке, чтобы получить эту работу в Википедии: Enable $wgCrossSiteAJAXdomains for wikimedia sites.

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

0

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

Смежные вопросы