« 【サイト研究】第5回 Piczo - また一風変わった写真共有 - (10/02) | メイン | Services_TechnoratiでTechonoratiを使い倒そう »

Dojoで簡単にクロスドメインAjaxを実現
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちわ、hideです。

最近、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型チャットを作っているので、近いうちに公開したいと思います。

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/361

この一覧は、次のエントリーを参照しています: Dojoで簡単にクロスドメインAjaxを実現:

» ウノウラボさんの comet 型チャットの実装が楽しみです from エースプログラマの uki-uki 日記
ウノウラボさんのブログで、DoJo キットの JSONP が便利だというエントリの中でちらっと、comet 型チャットを作ってるというお話が出てました。 ... [詳しくはこちら]

» Plaggerでみんなのブックマークをアグリゲート from ARK-Web SandBox Wiki (PukiWiki/TrackBack 0.3)
スタッフが利用しているソーシャルブックマーク(SBM)のRSSを、plaggerを使って試験的にアグリゲートしています。 2006-10-16 Mo... [詳しくはこちら]

» javaScriptでクロスドメイン通信がしたい。 from もものひびにっき
AJAXでは通常、クロスドメイン間のアクセスはできません。 でもJSONという形式で情報を返してもらう形にすると クロスドメイン間の通信が可能みたい... [詳しくはこちら]

» Dojo 1.0  Jsonpのサンプル from かけだしプログラマの奮闘記
最近リリースされたDojo1.0を使いJSONPでクロスドメインAJAXを実装しました。 0.4系からいろいろ仕様が変わっているようで結構苦労しまし... [詳しくはこちら]

コメント

Comet型チャット情報は楽しみにしてます!

日本語リファレンス的には
http://www.openspc2.org/reibun/js_books/#123
とかに載ってますね
読む人によるでしょうけど個人的にはお勧めです

↑これって dojo に関することは書かれてないような...

↑dojoものってますよ
手元にあるので後でよけば見てください。

おお、そうだったんですね。
web 見た感じではなさそうだったんですが、単なる思い込みでした。

↑のURLは筆者担当分だけ載っていたんだと思います
だから全部掲載されてないと.

とりあえずこちらでどーぞ
http://www.amazon.co.jp/gp/product/4798014001
有名どころは結構カバーしてます.
リファレンスとしてフルカバーはできてないけど手元にあると便利は便利

サンプルコードのurlを変えてみたら、「invalid label」となってしまいました*_*

Ajaxを使用しなくてクロスドメインが可能です。
今はβ版ですが、ごらんください。
http://petarna.com

動作するものがあると、理解も速くできて助かります。

ところで、上記サンプルコードはdojoの0.3.1で動作するんですね。1/11時点の0.4.1では、動きませんでした。

ごれんらくまで。

ma2shitaさん、コメントありがとうございます。

はい、0.4からは dojo.io.bind() を dojo.io.ScriptSrcTransport.bind() に変更しないと動作しなくなりました。

こちらの記事も参照してみてください。よろしくお願いします。

http://labs.unoh.net/2006/11/dojo_04.html

dojoの日本語情報が少ないので参考にさせて頂いています。

dojo.io.bind()ですが上記のコードのままで
mimetypeをtext/javascript,text/json,application/jsonのいずれかに指定すれば、0.4でも動作するようです。

その他、ScriptSrcTransportのcanHandleに通らない引数の場合は通信自体を試みないようです。

JavaScriptで、Flash経由でXMLを取得するライブラリを作りました。
こちらの、クリップボードのFlashをちょと参考にしました。
ぜひ、お試しいただければ幸いです。

http://firegoby.theta.ne.jp/archives/224

コメントを投稿


画像の中に見える文字を入力してください。