Yahoo! Query Language - YDNに式を指定するだけでクエリを投げられ、コールバック関数で結果を受け取れるようにするQuery YQLというjQueryのプラグインを作った。jQuery.getJSON()でもそんなに手間がかかるわけではないけど、エンドポイントとかcallback=?とか書くのがちょっと面倒だったのでプラグインにした。実装するのに2分、名前を考えるのに15分。

ソースを見ればわかる通り、jQuery.getJSON()とほぼ同じで、jQuery.get()のラッパー。将来を見据えてエンドポイントは設定で指定できるようにしようかと少し考えたけど、それは別にQuery YQL v2(またはQuery YQL v1)プラグインとか作ってやれば良さそうだと思ったので実装しなかった。色々オプション設定できるようにして複雑化させたらこのプラグインを書いた意味ないし。

使い方

<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript" src="jquery.query-yql.js"></script>
<script type="text/javascript">
var statement = "select * from feed where url='http://example.com/rss'";
$.queryYQL(statement, function (data) {
    // do something with "data".
    });
</script>

と、script要素で読み込んでおいて、式とコールバック関数を引数にjQuery.queryYQL()を呼ぶ。式は丸投げなので、最近実装されたinsertupdatedeleteもちゃんと使える。ちなみにjQuery.getJSON()で同じものを書くと、

<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript">
var statement = "select * from feed where url='http://example.com/rss'";
$.getJSON("http://query.yahooapis.com/v1/public/yql?callback=?", {
format: "json",
q: statement
}, function (data) {
// do something with "data".
});
</script>

ちょっと読みやすく、エンドポイントのURLを調べ(覚え)なくて済むのでかなり書きやすい。

また、第二引数にxmlを指定すると、最近実装されたJSONP-Xモードになる。

var statement = "select * from html where url='http://example.com/' and xpath='//a'";
$.queryYQL(statement, "xml", function (data) {
    // do something with "data".
    });

最初の例のように第二引数がコールバック関数の場合や第二引数でjsonを指定した場合はJSONPを利用する。

YQLのJSONP-Xの返すJSONデータ

Query YQLプラグイン自体とはあまり関係ない話だが、テスト・コードを書いている途中で若干はまったので触れておく。YQLのJSONPとJSONP-Xでは返ってくるJSONデータの構造が微妙に違う。JSONPでは、

{
  "query": {
    "results": {}
  }
}

resultsqueryの子になっているが、JSONP-Xでは、

{
  "query": {},
    "results": []
}

と双方がルートにある。単なるYQL側の実装ミスかもしれないので、今後ともこの形かどうかはわからないけど今は注意が必要。10分はまった僕が言うのだから間違いない。


プラグインにしたらしたでプラグイン・ファイルをコピーしてscript要素を書くのが面倒な気がしてくるという……。短いコードのプラグインなのでコピペで使うとかも良いかもしれない。