« Jetpack SDK 0.4 の Page Worker API | Jetpack SDK 0.5 の Selection API » |
Jetpack SDK 0.5 の Reuqest API
Jetpack SDK 0.5 で追加された Request API を使用すると、 XMLHttpRequest によってWebサーバとデータを送受信する処理をより簡単に実装できます。特に、レスポンスがJSONかXML形式であるようなWebサービスのAPIを利用する場合に重宝しそうです。
この記事では、 Request API を使い、Twitter でキーワード「Firefox 4」を含むツイートの検索結果をコンソールへ列挙する例を紹介します。
Twitter のAPI仕様
実装に入る前に、 Twitter の検索用APIの仕様を簡単に示しておきます。
リクエスト
キーワード xxx で検索する場合、以下のようなURLへGETメソッドで送信する。
http://search.twitter.com/search.json?q=xxx
レスポンス
キーワードにマッチしたツイートのデータが、下記のようなJSON形式で返る。
{ "results": [ { "text": "(1番目のツイートの内容)", "from_user": "(1番目のツイートの発言者)" ... }, { "text": "(2番目のツイートの内容)", "from_user": "(2番目のツイートの発言者)" ... }, { "text": "(3番目のツイートの内容)", "from_user": "(3番目のツイートの発言者)" ... }, ... ] }
実装
まず、 require 関数でモジュールをインポートします。
var requests = require("request");
次に、 Request APIの Request
コンストラクタを用いて、 Request オブジェクトのインスタンスを生成します。コンストラクタの引数には、以下のプロパティを有するオブジェクトを渡します。
プロパティ | 概要 |
---|---|
url |
データ送信先のURL |
onComplete |
データ受信時(XHRでいうところの readyState == 4)のコールバック処理 |
headers |
必要に応じてリクエストヘッダ(User-Agent や Referer)をオブジェクト形式でセットする。例:headers: { "User-Agent": "MyApp", Referer: "http://..." }, |
content |
必要に応じてリクエストのパラメータをオブジェクト形式でセットする。 |
contentType |
必要に応じてHTTPヘッダの Content-Type の値をセットする。 デフォルトでは application/x-www-form-urlencoded |
生成した Request インスタンスの get
メソッドを呼び出すと、GETメソッドでリクエストが送信されます。なお、 post
メソッドを呼び出すと、POSTメソッドでリクエストが送信されます。
// Request インスタンスの生成
var request = requests.Request({
url: "http://search.twitter.com/search.json",
content: { q: "Firefox 4" },
onComplete: function () {
// ToDo
}
});
// GETメソッドで送信
request.get();
Webサーバからのレスポンスが返って onComplete
メソッドがコールバックされると、 Request インスタンスの response
プロパティからレスポンス内容(Response オブジェクト)を取得することができるようになります。 Response オブジェクトは色々なプロパティを有し、 json
プロパティや xml
プロパティでレスポンスのボディ部をJSONあるいはXML形式でパースした結果を取得したり、 headers
プロパティでレスポンスのヘッダ部の各フィールド値を取得したりすることが可能です。
今回はレスポンスのボディ部をJSON形式でパースし、前述のAPI仕様にあるとおり "results" プロパティでツイートのデータの配列を取得し、配列の各要素に対して "from_user", "text" プロパティで発言者と発言内容を取得します。
onComplete: function () { var results = this.response.json.results; results.forEach(function(result) { console.log("user: " + result.from_user); console.log("text: " + result.text); }); }