WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

RESTful 形式の Google AJAX Feeds API を使って、フィードを JSONP で取得する

JavaScript のみで任意のフィードが取得できる Google AJAX Feeds API は、とても便利ですよね。活用されている方も多いと思います。でも、余計な機能も含んだ外部ライブラリを読み込むのがイマイチなところ。ページロード時間を気にする場合はちょっと利用を躊躇してしまいます。

ところが、そんな欠点も、実は既に解消されています。今年の 4 月に Flash など JavaScript 以外の言語のために RESTful 形式の API が追加されたのですが、それに callback の指定がちゃっかり存在しており、 JSONP でアクセスできるのです。これなら外部ライブラリを読み込む必要もなく、気軽に利用できます。とくに JSONP に慣れている方は、 JavaScript API よりも楽に覚えられるでしょう。

ということで、本日はその RESTful API を利用して、 JSONP でフィードを取得する方法をご紹介したいと思います。

リクエストを投げる

それでは、さっそく使い方をご紹介しましょう。まずはリクエストの投げ方です。 RESTful 形式なので、所定の URL に GET メソッドでリクエストを投げるだけでデータが取得できます。フィードの取得なら、以下の URL になります。

http://ajax.googleapis.com/ajax/services/feed/load?パラメータ

パラメータには以下のものが指定できます。

パラメータ名内容
q 読み込むフィードの URL
v バージョン番号。現在は1.0固定
hl 言語指定。通常は省略してOK
key APIキーの指定
callback JSONPのコールバック関数名
context callbackの第一引数にそのまま渡される文字列
num 取得するエントリの最大数。最大は100、省略時は4
output データ形式の指定。json, json_xml, xml のどれか
scoring=h 指定すると、キャッシュに残っている過去のエントリも取得する

例えばこのブログの Atom フィードなら、以下の URL にアクセスするだけで、 JSONP 形式のデータを取得できます。

http://ajax.googleapis.com/ajax/services/feed/load?q=http%3A%2F%2Fwebos-goodies.jp%2Fatom.xml&v=1.0&output=json&callback=foo&context=bar

JavaScript であれば、以下のようにして SCRIPT タグを挿入するのがよいでしょう。

// リクエストURLを構築
var requestURL = 'http://ajax.googleapis.com/ajax/services/feed/load?' + [
  // 'key=your-api-key', ここでAPIキーを指定するのが推奨されている
  'q=' + encodeURIComponent('http://webos-goodies.jp/atom.xml'),
  'v=1.0',         // APIバージョン
  'output=json',   // データ形式
  'callback=foo',  // コールバック関数
  'context=bar',   // コールバック関数に渡す文字列(省略すると引数の形式が変わるので注意)
  'num=8'          // 取得するエントリの最大数
].join('&');
 
// SCRIPTタグを作成し、bodyに追加
var e     = document.createElement('SCRIPT');
e.type    = 'text/javascript';
e.src     = requestURL;
e.charset = 'UTF-8';
document.body.appendChild(e);

なお、上記の例では API キーを省略していますが、本来は指定することが推奨されています。 API キーは以下のページで取得できます。

http://code.google.com/apis/ajaxfeeds/signup.html

API キーが指定されていれば、こちらのスクリプトなどに問題があった場合、連絡を取ることを「試みてくれる」そうです。

レスポンスを受け取る

リクエスト URL に callback と context のパラメータを含めた場合、 callback で指定した関数が以下の形式で呼び出されます。

callback(context, response, status, errorMsg)

引数はそれぞれ、以下の内容を格納しています。

引数名内容
context リクエストのcontextに指定した文字列そのまま
response 後述の形式のデータ
status 200 なら成功、それ以外ならエラー
errorMsg 成功なら null 、エラーの場合はエラーメッセージ

response に格納されているのは以下の形式のオブジェクトです。

{
  // 以下は output=json または output=json_xml のときのみ
  "feed" : {
    "title"       : フィードのタイトル,
    "link"        : フィードのリンクURL(通常は発行しているサイトのURL),
    "description" : フィードの説明,
    "author"      : フィードの発行者名,
    "entries" : [
      {
        "title"          : 記事のタイトル,
        "link"           : 記事のURL,
        "content"        : 記事本文(HTMLタグを含む),
        "contentSnippet" : 記事本文からタグを削除し、最大120文字を切り出したもの,
        "publishedDate"  : 発行日。new Date(publishedDate)で日付オブジェクトに変換可能,
        "categories"     : Atom や RSS の <category> タグの内容を格納した文字列配列
      },
      // ...上記がエントリ数分並ぶ...
    ]
  },
  // 以下は output=xml または output=json_xml のときのみ
  "xmlString" : XMLバージョンのフィードデータの文字列
}

XML 形式のデータが文字列で返ってくるのは、クロスドメインで XML データを取得するための苦肉の策でしょう。 IE なら ActiveXObject("MSXML2.DOMDocument.3.0")、 その他のブラウザなら DOMParser を使って XML ドキュメントに変換できます。ほとんどの場合は JSON 形式でじゅうぶんですが、 XSLT が使えるのは便利かもしれません。

なお、リクエストで context パラメータを省略した場合は、引数の形式が変わって以下のようになります。

callback(response_without_context)

この場合、第一引数には以下の形式のオブジェクトが渡されます。 response, status, errorMsg は context が指定された場合に渡されるのと同じものです。

{
  "responseData" : response,
  "responseStatus" : status,
  "responseDetails" : errorMsg
}

JavaScript 以外の言語で利用する場合も、この形式を使うことになるでしょう。

サンプル

説明だけでは寂しいので、サンプルとして RESTful 形式の Google AJAX Feeds API を使ってフィードを取得するデモを作ってみました。以下のテキストボックスにフィードの URL を入力して「読み込み」ボタンを押せば、フィードの先頭 8 エントリのタイトルを表示します。

Feed URL :

ソースはこちら。 HTML ファイルにコピペするだけで動くようになっています。

以上、本日は RESTful 形式の Google AJAX Feeds API を使って、ライブラリに頼らずにフィードデータを取得する方法をご紹介しました。 Google AJAX Feeds API にはフィードデータの取得のほかにキーワードにマッチするフィードを取得する find と指定した Web ページのフィードを取得する lookup という機能があり、もちろん RESTful で使えます。その気になれば、本格的なフィードリーダーも実装できそうですね。

また、 Google AJAX Feeds API のほかに Google AJAX Search API, Google AJAX Language API が RESTful 形式をサポートしており、非公開ながら Google Visualization API も RESTful でアクセス可能です(こちらの記事の「サーバーサイドでの利用も可能」でご紹介しています)。いずれも便利な API ですから、それらが外部ライブラリなしで利用できるのは嬉しい限りです。

このように手軽になった Google AJAX APIs 、使わない手はありませんね。ぜひ活用して、素晴らしいサービスの構築に役立ててください!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles