JSONのセキュリティビットを理解するのに少し問題があります。理論的には機能しないはずのことが、機能しているように見えることが多いからです。ドメインAにあるページのスクリプトからの呼び出しであるAFAIKは、ドメインBからデータを受信できるとは想定されていません。ただし、以下のコードでは、1つの外部ドメインへの呼び出しは失敗しますが、別のドメインは通過します。また、どちらもパックされたJSON呼び出し(jsonp)ではありません。
どうしてこれなの?両方がブラウザのセキュリティチェックを通過することを禁止されるべきではありませんか?ChromeとFirefoxでも同じ結果が得られます。dropbox.comで以下のhtmlページをホストすると、Chromeから次のエラーメッセージが表示されます。
XMLHttpRequestは http://www.odinfond.no/rest/fund/calc/fundReturn?&id=300&oneTimeInvestment=100000&oneTimeInvestmentDate=2009-11-01&endDate=2010-11-01¤cy=NOKをロードできません。Origin 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>