あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

遅ればせながらYQLに感動した

遅ればせながら、この前YQLを使う機会があったのですが、これはなんとも素敵なサービスですね。

まだ馬鹿の一つ覚えで、XMLとかAtomとかRSSJSONPにまるまる変換することしかできないですけど、それだけでも十分役立つ。Yahoo!Pipesもすごいと思ったけど、YQLの方が気軽で使い勝手がいい。

YQLはどういう時に使えるのか?

YQLは、WebAPIで、XMLの出力でしか対応してないサービスとかを、JavaScriptだけ使ってプログラミングしたいという時などに使えます。

例えば、Google Ajax Search APIは、問い合わせ結果をJSONPで出力してくれるので、JavaScriptだけでプログラミングができますが、Yahoo!JapanのWeb検索APIは、問い合わせ結果をXMLでしか出力してくれないので、クロスドメインの制約にひっかかってしまい、JavaScriptだけでプログラミングすることはできません。

そんなときにYQLの出番ですよ。

ただ、ちょっとYQLのURLの作成がめんどくさいので、YQLBuilderなるヘルパークラスを用意しました。ある程度汎用的にしています。

こんな感じ

var YQLBuilder = function(opts) {
  var target = (function() {
    if (!opts.params) {
      return opts.url;
    }
    var params = [];
    for (var key in opts.params) {
      params.push(key + '=' + opts.params[key]);
    };
    if (params.length > 1) {
      return opts.url + '?' + params.join('&');
    }
    else {
      return opts.url + '?' + params[0];
    }
  })();
  this.url = (function(o) {
    var url = o.yqlapi + '?q=' + encodeURIComponent((function() {
      opts.yqlstring = opts.yqlstring.replace(/<<url>>/, target);
      if (opts.xpath) {
        opts.yqlstring = opts.yqlstring.replace(/<<xpath>>/, opts.xpath);
      }
      return opts.yqlstring;
    })());
    if (opts.format === 'json' && opts.callback) {
      return url + '&format=json' + '&callback=' + opts.callback;
    }
    else if (opts.format === 'json') {
      return url + '&format=json';
    }
    else {
      return url + '&format=xml';
    }
  })(this);
};
YQLBuilder.prototype.yqlapi = 'http://query.yahooapis.com/v1/public/yql';

// 例:Yahoo!Japanのウェブ検索APIを、YQLJSONPにするURLの生成
var yahoo = new YQLBuilder({
  // yqlstringには、YQLを記述する。urlとxpathの値は、yqlstring内ではそれぞれ<<url>>、<<xpath>>と書いて、
  // 詳細は引数オブジェクト内のurlプロパティとxpathプロパティに書く。
  // urlプロパティのパラメータは、paramsプロパティに書くか、urlプロパティに直接書く。
  yqlstring : "select * from xml where url='<<url>>'",
  url : 'http://search.yahooapis.jp/WebSearchService/V1/webSearch',
  params : {
    query : '検索文字列をここに入力',
    appid : 'アプリケーションIDをここに入力',
    results : 50
  },
  format : 'json',
  callback : 'callback'
});

yahooオブジェクトのurlプロパティに、YQLを通したJSONPの出力を得られる、Yahoo!JapanのWeb検索APIのURLが格納されます。

一旦JSONPになってしまえば、後はJavaScriptで煮るなり焼くなりできます。

米Yahoo!は本当にGeekのツボを心得ていらっしゃる。Googleが始めるサービスよりもYahoo!が始めるサービスの方がワクワクするのは気のせいではないはず。

YQLを使うと、JavaScriptプログラミングの楽しさが格段に向上しそうですね!