Dojoで簡単にクロスドメインAjaxを実現
最近、JavaScriptライブラリのDojoを使い初めて、その便利さに目覚めてしまいました。Ajaxで使用される通常のXMLHttpRequestではセキュリティ上の理由から、現在表示しているページ以外のドメインに対してリクエストを送ることができません。そこで考え出されたのが、JSONP(JSON with padding)という方法です。JavaScriptのインクルードは、同一ドメインでなくても読み込めるという性質を利用しています。
まずは下のボタンを押してみてください。実際にYahoo!から画像検索が実行されます。サーバを介さずにブラウザから直接Yahoo!APIを呼び出しているところがポイントです。
簡単に説明するとこういう仕組みです。次のようにリクエスト時のパラメータとして、callback関数を指定します。
http://example.com/json/?callback=importJSサービス提供側は、このcallback関数でくくってデータを返します。
importJS([{"color":"red", "price":100}, {"color":"blue", "price":200}]);
このレスポンスは、JavaScriptとして実行されるので、importJSという関数を自分で用意しておけば、JSON形式のデータを引数で受け取って処理できるというわけです。このJSONPは、いろいろなJavaScriptライブラリから使えるのですが、DoJoを利用すると通常のXMLHttpRequestと同じように利用することができます。次が、サンプルコードです。
<html>
<head>
<script type="text/javascript" src="dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.io");
dojo.require("dojo.io.ScriptSrcIO");
function getJSONP() {
dojo.io.bind({
url: 'http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=jsondemo' +
'&output=json&results=20&query=beach',
transport: "ScriptSrcTransport",
jsonParamName: "callback",
load: function(type, data, event, kwArgs) {
showOutput(data);
}
});
}
function showOutput(json) {
data = json['ResultSet']['Result'];
var html = '';
for (var i=0; i<data.length; i++) {
html += '<a href="'+data[i].RefererUrl+'">';
html += '<img src="' + data[i].Thumbnail.Url + '" height="100"></a>';
}
document.getElementById('output').innerHTML = html;
}
</script>
</head>
<body>
<input type="button" onclick="getJSONP()" value="Run"/>
<div id="output"></div>
</body>
</html>
このDojoですが、IT戦記さんのブログで紹介されているようにMochiKitを管理下に置けたりしてかなり面白いです。難点は日本語の情報がほとんどないことですが、本家のドキュメントが充実しているので使い方は理解できるんじゃないかと思います。今、僕はDojoとPythonで書かれた非同期フレームワークTwistedをバックエンドにおいたComet型チャットを作っているので、近いうちに公開したいと思います。

コメント
Comet型チャット情報は楽しみにしてます!
投稿者: Anonymous | 2006年10月 6日 01:01
日本語リファレンス的には
http://www.openspc2.org/reibun/js_books/#123
とかに載ってますね
読む人によるでしょうけど個人的にはお勧めです
投稿者: jokagi@unoh | 2006年10月 6日 10:28
↑これって dojo に関することは書かれてないような...
投稿者: masato | 2006年10月 6日 11:24
↑dojoものってますよ
手元にあるので後でよけば見てください。
投稿者: Keita | 2006年10月 6日 14:17
おお、そうだったんですね。
web 見た感じではなさそうだったんですが、単なる思い込みでした。
投稿者: masato | 2006年10月 6日 14:29
↑のURLは筆者担当分だけ載っていたんだと思います
だから全部掲載されてないと.
とりあえずこちらでどーぞ
http://www.amazon.co.jp/gp/product/4798014001
有名どころは結構カバーしてます.
リファレンスとしてフルカバーはできてないけど手元にあると便利は便利
投稿者: jokagi@unoh | 2006年10月 6日 14:37
サンプルコードのurlを変えてみたら、「invalid label」となってしまいました*_*
投稿者: h | 2006年10月16日 19:38
Ajaxを使用しなくてクロスドメインが可能です。
今はβ版ですが、ごらんください。
http://petarna.com
投稿者: tanahara | 2006年10月28日 16:47
動作するものがあると、理解も速くできて助かります。
ところで、上記サンプルコードはdojoの0.3.1で動作するんですね。1/11時点の0.4.1では、動きませんでした。
ごれんらくまで。
投稿者: ma2shita | 2007年1月11日 06:22
ma2shitaさん、コメントありがとうございます。
はい、0.4からは dojo.io.bind() を dojo.io.ScriptSrcTransport.bind() に変更しないと動作しなくなりました。
こちらの記事も参照してみてください。よろしくお願いします。
http://labs.unoh.net/2006/11/dojo_04.html
投稿者: hide | 2007年1月11日 10:51
dojoの日本語情報が少ないので参考にさせて頂いています。
dojo.io.bind()ですが上記のコードのままで
mimetypeをtext/javascript,text/json,application/jsonのいずれかに指定すれば、0.4でも動作するようです。
その他、ScriptSrcTransportのcanHandleに通らない引数の場合は通信自体を試みないようです。
投稿者: sinf | 2007年3月21日 14:05
JavaScriptで、Flash経由でXMLを取得するライブラリを作りました。
こちらの、クリップボードのFlashをちょと参考にしました。
ぜひ、お試しいただければ幸いです。
http://firegoby.theta.ne.jp/archives/224
投稿者: miya | 2009年4月22日 20:24