У меня есть небольшая проблема с пониманием безопасности JSON, потому что часто вещи, которые теоретически не должны работать, по-видимому, работают. Насколько я знаю, вызовы из скрипта на странице, которая находится в домене A, не должны иметь возможность получать данные из домена B. Но в приведенном ниже коде вызовы к одному внешнему домену терпят неудачу, тогда как другой проходит. И ни один из них не является упакованным вызовом JSON (jsonp).
Почему это? Не следует ли запретить обоим проходить проверку безопасности браузера? Я получаю те же результаты в Chrome и Firefox. Если я размещу приведенную ниже html-страницу на dropbox.com, Chrome выдаст мне это сообщение об ошибке:
XMLHttpRequest не может загрузить http://www.odinfond.no/rest/fund/calc/fundReturn?&id=300&oneTimeInvestment=100000&oneTimeInvestmentDate=2009-11-01&endDate=2010-11-01¤cy=NOK. Источник http://dl.dropbox.com не разрешен Access-Control-Allow-Origin.
Ответ JSON, который я получил бы, если бы звонок прошел, можно увидеть, щелкнув эта прямая ссылка. Вызов другой службы успешно возвращается. Я размещаю приведенный ниже код в Dropbox. Попробуйте здесь.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
<title>JSON/JSONP test</title>
<script src="jquery.js" type="text/javascript"></script>
</head>
<body>
<script>
service = 'http://www.odinfond.no/rest/fund/calc/fundReturn?';
parameters = {
id: '300',
oneTimeInvestment:'100000',
oneTimeInvestmentDate:'2009-11-01',
endDate:'2010-11-01',
currency:'NOK'
}
$.getJSON( service, parameters, function(data) {
alert("Success");
});
service = 'http://ws.geonames.org/postalCodeLookupJSON?'
parameters = {
postalcode:1540,
country:'NO'
}
$.getJSON(service, parameters, function(data) {
alert(data.postalcodes[0].adminName2);
});
</script>
<p>Use Firebug to see JSON response</p>
</body>
</html>