JSONPについて

AmazonJSON呼び出しだけど、どうやら本家(?いや最速の方か)でJSONPに対応したらしい。これで一応IESafariでもつかえる。
http://labs.hail2u.net/amazon/

日本語のリソースが少ないためか、JSONPについて説明していた。
http://hail2u.net/blog/coding/jsonscriptrequest.html
ちなみにJSONPとはJSON with paddingの略

実は、いろいろ試してみてたのだけど、JSONPってかなりサポート範囲が大きい。手元の環境では、IEFirefoxはもちろん、Safari 2.0(1.3も)、auのケータイフルブラウザ(Opera)でも動いてたりする。もしかしたらDSブラウザでも動くんじゃないか?持ってないので試してないけど*1。参照系のコールだけならXMLHttpRequestをあえて使う必要は無いくらい。しかもクロスドメイン読み込みが可能なのだ。

残念ながら上記の記事ではちょっと間違えているっぽいのだけど、本来JSONPの肝は、URLのパラメータとして渡した名前をコールバック関数名として、JSON形式のデータを引数に呼び戻してくれることにある。例えば、スクリプトロード時に固定変数名でJSONを読み込みする方法では、リクエストを複数同時実行すると互いに読み込んだデータを壊してしまう可能性が高いため、パラレルなリクエストに制約が出てくる。一方、JSONPならコールバックに任意の関数を指定できるのでその心配は無い。もちろんこれにより名前の衝突の問題も回避できることになる。

dojoのScriptSrcIOなんかはその辺をうまく包み込んで、使い勝手をほぼXMLHttpRequestの非同期リクエストと同じくらいにしている。もちろんdojoまで使わなくとも単純に上記の JSONScriptRequest (jsr_class.js) みたいなやり方でもかまわないし、自分はこんなスクリプトを使っている。

さらにJSONPをおすすめする理由としては、上記のAmazon(XSLTによるHack)はもちろん、Yahoo! (USのみ)、del.icio.us、果てはGoogleも実は密かにこのJSONPに対応しているのだ、ということ。このあたりはいろいろこのブログで書いてきたので興味のある人は掘り起こして見てください。まとめ的にJSONPテストページみたいなものも作ってます。

*1:だれかもってたらこの辺で試してみてください http://www.geocities.jp/stormriders999/ysearch.html