ユーザ用ツール

サイト用ツール


ajax:crossdomain

文書の過去の版を表示しています。


別ドメインのデータを非同期で取得する

XMLHttpRequestにはドメインの異なるサイトからデータを取得できないという、クロスドメインの制限がある。

JSONPを使ってクロスドメイン制限を越える

JSONPは、引数にJSON文字列を渡した関数呼び出しの書式で使う

// JSON
{ fuga : "ふが?" };
 
// JSONP
hoge({ fuga : "ふが?" });

JSONPによるクロスドメインリクエストは、SCRIPTタグのSRC属性がドメインを問わないことを利用している。まず、ドキュメントにSCRIPTタグを動的に追加し、別ドメインからJSONP形式で記述されたJavaScriptファイルを取得する。JSONPはJavaScriptの関数呼び出しの書式なので、ロード完了と同時にJavaScriptの関数として実行される。その関数をあらかじめ呼び出し元で定義しておくことで、別ドメインから得られたデータを利用することができる。

読み込み元に、JSONP読み込み時に実行されるコールバック関数を記述。

function hoge(obj) {
    window.alert(obj.fuga); 
}

JSONPをリクエスト、http://otherdomain.example.com/hoge.cgi?callback=hogeがJSONPを返すとする。DOMを操作し以下のようなscript要素をドキュメントに追加すると、Scriptファイルがダウンロードされ、hoge関数が実行される。

<script src="http://otherdomain.example.com/hoge.cgi?callback=hoge" type="text/javascript"></script>

JSONscriptRequest クラスというライブラリを利用すると簡単に実装できる。

JSONPスクリプトが読み込まれた瞬間、JSONPは1で定義したJavaScriptの関数として実行される

hoge({ fuga : "ふが?" });  // JSONPは関数hogeとして実行され、アラートに「ふが」と表示</pre>

GETリクエストしか使えない、XMLHttpRequestに比べるとできる事が少ない等の欠点がある。

Dojoフレームワーク

JSONPによるクロスドメイン非同期リクエストは、Dojoフレームワーク等でサポートされている。

// for Dojo 0.4
dojo.require("dojo.io");
dojo.require("dojo.io.ScriptSrcIO");
 
dojo.io.ScriptSrcTransport.bind({
    url: "http://example.com/intiki_url",
    jsonParamName: "callback",
    load: function(type, data, event, kwArgs) {
        for (var i in data) {dojo.debug(i + " = " + data[i])};
    }
});
ajax/crossdomain.1195403452.txt.gz · 最終更新: 2007/11/18 16:30 by 127.0.0.1